本文主要介绍ZeroC IceBox的相关知识,以及如何构建一个IceBox的demo程序。
IceBox是为Ice服务提供的一个易用框架。
待补充...
说明:本文介绍的demo程序是在Centos 7上、使用C++语言开发的,对应的ice、icebox版本为3.6.4。
沿用前文《ZeroC Ice介绍与简单demo构建》中已编写的基础框架文件(即Hello.ice、Hello.h、Hello.cpp、HelloI.h、HelloI.cpp),我们继续编写IceBox需要的其他文件。
2.5 编写IceBox服务器实例代码
说明:本节继承了前文《ZeroC Ice介绍与简单demo构建》的部分内容,所以本节直接以2.5小节开始计数。
要将一个Ice服务(IceBox服务器实例)封装到IceBox服务器中,需要让这个Ice服务的服务实现类继承IceBox定义的Service接口。
Ice服务的服务实现类HelloServiceI的声明代码(HelloServiceI.h)如下:
#ifndef __HELLOSERVICEI_H__
#define __HELLOSERVICEI_H__
#include
class HelloServiceI : public ::IceBox::Service
{
public:
HelloServiceI();
virtual ~HelloServiceI();
virtual void start(const ::std::string&, const ::Ice::CommunicatorPtr&, const ::Ice::StringSeq&);
virtual void stop();
private:
::Ice::ObjectAdapterPtr _adapter;
};
#endif
Ice服务的服务实现类HelloServiceI的具体实现代码(HelloServiceI.cpp)如下:
#include
#include
#include
using namespace std;
HelloServiceI::HelloServiceI()
{
}
HelloServiceI::~HelloServiceI()
{
}
void HelloServiceI::start(const string& name, const Ice::CommunicatorPtr& communicator, const Ice::StringSeq& /*args*/)
{
_adapter = communicator->createObjectAdapter(name);
Demo::HelloPtr object = new HelloI;
_adapter->add(object, communicator->stringToIdentity("hello"));
_adapter->activate();
}
void HelloServiceI::stop()
{
_adapter->destroy();
}
服务实现类HelloServiceI对应的Ice服务的入口点“entry_point”代码(HelloService.cpp)如下:
#include
#include
extern "C"
{
//
// Factory function
//
ICE_DECLSPEC_EXPORT IceBox::Service* create(Ice::CommunicatorPtr)
{
return new HelloServiceI;
}
}
注意:本文到现在为止,介绍的几个文件(Hello.ice、Hello.h、Hello.cpp、HelloI.h、HelloI.cpp、HelloServiceI.h、HelloServiceI.cpp、HelloService.cpp)为搭建IceBox的demo时需要使用的基础框架文件,对于其他需要用到IceBox技术进行demo搭建的文章,如无特殊说明,均沿用了这八个基础文件。相关的demo搭建链接如下:
2.6 编写客户端代码
客户端代码通过IceBox中的Ice服务提供的Ice对象ID连接服务端,并调用(与该Ice对象ID)相关的方法。
客户端代码(client.cpp)如下:
#include
#include
using namespace std;
using namespace Demo;
int main(int argc, char* argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try
{
ic = Ice::initialize(argc, argv);
Ice::ObjectPrx base = ic->stringToProxy("hello:default -p 10000");
HelloPrx hello = HelloPrx::checkedCast(base);
if (!hello)
{
throw "Invalid proxy";
}
string result = "";
result = hello->SayHello("liitdar");
cout << "[icebox] client's result: " << result << 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;
}
2.7 编译生成客户端和IceBox的服务
编译生成客户端应用程序(client),命令如下:
g++ -o client -I. client.cpp Hello.cpp -lIce -lIceUtil -lpthread
编译生成IceBox的服务(libHelloService.so),命令如下:
g++ -shared -fPIC -o libHelloService.so -I. HelloService.cpp HelloServiceI.cpp HelloI.cpp Hello.cpp -lIce
2.8 编写IceBox及其服务的配置文件
IceBox的配置文件(config.icebox)内容如下:
#
# The hello service
#
IceBox.Service.Hello=./HelloService:create --Ice.Config=config.service
通过使用一个单独的IceBox.Service属性,将一个Ice服务配置到IceBox服务器中。IceBox.Service属性的格式如下:
IceBox.Service.name=entry_point [args]
IceBox封装的Ice服务的配置文件(config.service)内容如下:
#
# The service creates one single object adapter with the name of the
# service. The following line sets the endpoints for this adapter.
#
Hello.Endpoints=tcp -h localhost -p 10000
上述配置主要是为对象适配器“Hello”(同时也是Ice服务)设置端点,供客户端进行寻址连接。
2.9 运行IceBox服务器及客户端
在一个终端中,运行如下命令,启动IceBox服务器:
icebox --Ice.Config=config.icebox
在另外一个终端中,运行客户端,如下:
./client
正常情况下,我们能够在上面的两个终端中看到IceBox服务器中的Ice服务与客户端的信息交互情况,如下:
【IceBox服务器】:
【客户端】:
如果两个终端中出现了上述信息,说明IceBox的demo程序部署成功了。