用ICE框架可以很容易地实现远程函数调用,广泛使用在分布式系统中。
ICE框架由客户端和服务器组成,支持客户端并发地调用服务器的服务。默认是一个同步调用。可以改成异步调用。
下面给出一个简单的例子。实现客户端和服务器间的一问一答。
服务器部分:
服务器做的工作稍微多点,首先我们需要定义一个ice文件,包含我们需要的接口。
IM.ice
#ifndef IM_ICE
#define IM_ICE
module IM {
interface IMInterface {
int SendMsg(
string req,
out string rsp);
};
};
#endif
然后使用slice2cpp这个bin生成IM.h和IM.cpp,
slice2cpp IM.ice
自己写一个类IMInterfaceI继承IMInterface,并实现SendMsg这个方法。
SendMsg在IMInterface中是一个纯虚函数,必须在IMInterfaceI中实现。
IMInterfaceI.h
#ifndef __IM_INTERFACE_I_H__
#define __IM_INTERFACE_I_H__
#include "IM.h"
using namespace IM;
class IMInterfaceI : public IMInterface {
::Ice::Int SendMsg(const ::std::string&, ::std::string&, const ::Ice::Current& = ::Ice::Current());
};
#endif
IMInterfaceI.cpp
#include "IMInterfaceI.h"
#include <iostream>
using namespace std;
::Ice::Int IMInterfaceI::SendMsg(const ::std::string& req, ::std::string& rsp, const ::Ice::Current&) {
cout << req << endl;
getline(cin, rsp);
return 0;
}
这样我们就可以启动这个服务了,让客户端来调用SendMsg这个接口。
Server.cpp
#include <Ice/Ice.h>
#include "IMInterfaceI.h"
using namespace std;
int main(int argc, char** argv) {
int status = 0;
Ice::CommunicatorPtr ic;
try {
ic = Ice::initialize(argc, argv);
Ice::ObjectAdapterPtr adapter =
ic->createObjectAdapterWithEndpoints("IM", "default -p 9999");
//IMInterfaceI是由ice文件生成的类派生出来的
Ice::ObjectPtr object = new IMInterfaceI();
//"IMInterface"是我们这个实例的标志符
//以后提供给客户端的连接串就是"IMInterface:default -p 9999"
//default = tcp -h 127.0.0.1,可以显式表达
adapter->add(object, ic->stringToIdentity("IMInterface"));
adapter->activate();
ic->waitForShutdown();
} catch (const Ice::Exception& e) {
cerr << e << endl;
status = 1;
} catch (const char* msg) {
cerr << msg << endl;
status = 1;
}
if (ic) {
try {
ic->destroy();
} catch (const Ice::Exception& e) {
cerr << e << endl;
status = 1;
}
}
return status;
}
最后编译连接,这个服务就可以用了。
c++ -I. -I$ICE_HOME/include -c IM.cpp IMInterfaceI.cpp Server.cpp
echo ".o generated successfully!\n"
c++ -o Server IM.o IMInterfaceI.o Server.o -L$ICE_HOME/lib -lIce -lIceUtil
echo ".o linked successfully!\n"
客户端部分:
将Server的ice文件拷过来,用slice2cpp这个bin生成IM.h和IM.cpp
然后就可以调用了。
#include "IM.h"
#include <Ice/Ice.h>
#include <iostream>
#include <cstring>
using namespace std;
using namespace IM;
int main(int argc, char** argv) {
int status = 0;
Ice::CommunicatorPtr ic;
try {
ic = Ice::initialize(argc, argv);
//"IMInterface:default -p 9999"是服务器提供的连接串
Ice::ObjectPrx base = ic->stringToProxy("IMInterface:default -p 9999");
IMInterfacePrx ptr = IMInterfacePrx::checkedCast(base);
if (!ptr)
throw "Invalid proxy";
string req, rsp;
while (getline(cin, req)) {
ptr->SendMsg(req, rsp);
cout << rsp << endl;
}
} catch (const Ice::Exception& ex) {
cerr << ex << endl;
status = 1;
} catch (const char* msg) {
cerr << msg << endl;
status = 1;
}
if (ic)
ic->destroy();
return status;
}
客户端的编译生成可执行文件的脚本。从脚本可以清晰地看到3个步骤。
1.slice2cpp生成一些.h,.cpp文件
2.编译出.o文件
3.连接.o文件形成可执行文件Client
ICE_HOME=/opt/ICE
slice2cpp IM.ice
c++ -I. -I$ICE_HOME/include -c IM.cpp Client.cpp
c++ -o Client IM.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil
分享到:
相关推荐
ICE异步调用Demo(slice源码和C++源码) 服务器和客户端adm ami函数调用与异步分发 vs2008+ice3.4.1
ICE 异步调用 按照网上已有的例子,客户端调用需要加入["ami"]元数据指定,但ICE 3.4以后的版本不支持,所以对于ICE3.4以后的版本可以用begin_API进行异步调用。本资源的ICE的版本为3.6.1,所以需要提前下载好ICE...
Ice 是一种针对客户端和服务器进行通信的面向对象的中间件平台。Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。...客户和服务器可以分别部署,可以运行在...本代码为ice同步调用和异步调用实例代码。
matlab ice.fig 函数源代码
ice最简单实现 ruby调用ice接口 - Ruby - language - ITeye论坛
Ice通信框架简介;Ice通信框架简介;Ice通信框架简介
使用python脚本进行ICE协议服务测试时,需要用到回调函数等模块,本文档中提供了常用的ICE调用函数,包括:回调函数等使用方法,模拟客户端client调用服务;
平台编译环境:VS2017 ICE版本:3.7.7 ICEbuilder:5.0.9 源码中有两套程序: Server:启动服务器,等待连接 。连接后可双方通信 Client:连接服务器,与服务器通讯。 Slice: 手写几个接口即可。
MATLAB中ice函数代码描述 这是Price Weller Pinkel()海洋混合层模型的Python实现。 此代码基于PWP模型的MATLAB实现,该模型最初由(美国罗德岛州)编写,后来由Byron Kilbourne(华盛顿大学)和Sarah Dewey...
介绍了.net环境下rpc远程调用,包括信道远程对象,注册,激活,代理获取等。通过代码运行更好的理解rpc调用的真个过程。
远程调用框架 Zero ICE 3.5.1 jar
MATLAB中ice函数代码冰动力 我将在这里发布我的matlab文件,以了解项目的动态。 到目前为止,它分为两个文件夹: 函数:为运行代码而创建的所有函数(运行脚本时确保将此文件夹添加到路径中) 计算:用于获取有关冰...
RPC(Remote Procedure Call Protocol 远程过程调用协议),是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC假定某些传输协议的存在,如TCP或UDP,为通讯程序之间携带信息数据;在...
MATLAB中ice函数代码
ZeroC Ice 3.7 手册 ... RPC(Remote Procedure Call Protocol 远程过程调用协议),是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC假定某些传输协议的存在,如TCP或UDP,
PHP通过ice调用python程序.pdf