- 论坛徽章:
- 0
|
Ice-3.3.1-demos\demo\book\printer这个例子是最经典而且最简单的例子之一了:em17:
首先看看ice文件的定义。
定了通讯的函数和参数以及返回值,当然这个例子中是单向的,不带返回值的。
#ifndef SIMPLE_ICE
#define SIMPLE_ICE
module Demo //模块,或者namespace都行
{
//接口,对应到代码中就是类
interface Printer
{
void printString(string s);//虚函数,通讯接口,slice有自己支持的类型,
//基本上都能转换成C++或者java中OOP的类型
};
};
#endif
|
第二步,生成对应语言的代码
如果你是c++开发人员,直接slice2cpp Printer.ice,就会生成Printer.h和Printer.cpp
或者你是java开发人员,直接slice2java Printer.ice就会生成一堆java的代码。
第三步,构建自己的应用。
对于客户端,正如上面说的,直接构造数据,创建连接,发送数据就行了。如以下代码
Client.cpp
#include <Ice/Ice.h>
#include <Printer.h>
using namespace std;
using namespace Demo;
int
main(int argc, char * argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try {
ic = Ice::initialize(argc, argv);
//default是tcp协议,也可以直接写tcp或者udp, -h 192.168.1.100 -t 2000超时
Ice::ObjectPrx base = ic->stringToProxy(
"SimplePrinter:default -p 10000");
;PrinterPrx printer = PrinterPrx::checkedCast(base);
if (!printer)
throw "Invalid proxy";
//远程调用
printer->printString("Hello World!");
} catch (const Ice::Exception & ex) {
cerr << ex << endl;
status = 1;
} catch (const char * msg) {
cerr << msg << endl;
status = 1;
}
if (ic) {
try {
ic->destroy();
} catch (const Ice::Exception & ex) {
cerr << ex << endl;
status = 1;
}
}
return status;
}
|
对于服务端,继承生成代码中的基类,实现其中的虚函数就够了。一切应用都做在虚函数的实现中,如Server.cpp
#include <Ice/Ice.h>
#include <Printer.h>
using namespace std;
using namespace Demo;
//Printer类实际上是ice生成代码中包含的,我们只需要继承这个基类,实现其中的virtual函数就行了
class PrinterI : public Printer
{
public:
virtual void printString(const string & s,
const Ice::Current &);
};
//数据处理,在这里可以随心所欲的处理,打印,入库等等
//(有一点要注意,如果是带返回类型的,这里的处理要注意超时,因为客户端的需要等待远程
//调用返回后,才表示调用完成)
void
PrinterI::
printString(const string & s, const Ice::Current &)
{
cout << s << endl;
}
int
main(int argc, char* argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try {
ic = Ice::initialize(argc, argv);
//两边采用一样的约定就行。
Ice::ObjectAdapterPtr adapter
= ic->createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -p 10000");
Ice::ObjectPtr object = new PrinterI;
adapter->add(object,
ic->stringToIdentity("SimplePrinter"));
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;
}
| 就这样通讯过程完成了。关于ICE的复杂特性和高级用法,多多参考文档,或者去zeroc的论坛看帖子也不错。
对了,还没说运行,先启动server,然后执行client,每次client调用一个字符串作为参数,server端都会打印出来。
这种RPC的做法或者思想确实很省事。
[ 本帖最后由 duanjigang 于 2009-11-5 16:55 编辑 ] |
|