Zeroc Ice是一款通信组件。其开发主要分一下几步:
1) 编写slice文件
2) 通过slice2cpp工具将slice文件翻译成相应的.h和.cpp文件
3) 编写服务端
4) 编写客户端
以下仅以官方上的例子做说明:
1、 slice文件定义printer.ice:
module Demo
{
interface Printer
{
void printString(string str);
};
};
注意:
a、 文件中必须要有根module,否则翻译失败
b、 module翻译后对应C++的命名空间,interface翻译后对应C++的类名
c、 module后interface中的} 必须跟';'符号,否则翻译失败
2、 通过slice2cpp工具将printer.ice翻译成对应的.h和.cpp文件
slice2cpp 命令如下:start slice2cpp printer.ice --stream
可以发现对应目录下多出来两个文件:printer.h printer.cpp
3、 服务器编写:
服务器编写首先要实现Printer接口:
class PrinterImpl : public Demo::Printer
{
void printerString(const std::string &strIn, const Ice::Current /*= Ice::Current()*/)
{
std::cout<<strIn;
}
};
服务器主体代码:
void main(int args, char* argv)
{
Ice::CommunicatorPtr ic;
try
{
ic = Ice::Initialize(args, argv); // ice组件初始化工作
// 创建代理适配器,一个ic组件可以有多个代理适配器
// PrinterAdapterPrx作为代理适配器的名称,可以自由定义,但是一个ic组件下的代理适配器名称必须唯一
// default -p 10000 代理适配器监听端口配置,端口必须唯一
Ice::ObjectAdapterPrx oAdapterPrx = ic->createObjectAdatperWithEndpoints("PrinterAdapterPrx", "default -p 10000");
// 创建服务
Ice::ObjectPtr oServant = new PrinterImpl();
// 代理适配器管理服务
// PrinterServant为服务的名称,一个代理适配器下可以管理多个服务
// 同一个代理适配器下的多个服务名称必须唯一
oAdapterPrx->add(oServant, ic->stringToIdentity("PrinterServant"));
// 激活代理适配器
oAdapterPrx->activate();
// 主线程等待客户请求
ic->waitForShutdown();
}
catch(Ice::LocalException &ex)
{
std::cout << ex.ice_name();
}
if (NULL != ic)
{
// 关闭组件
ic->destroy();
}