ZeroC IceBox介绍

本文主要介绍ZeroC IceBox的相关知识,同时通过一个IceBox的demo程序介绍其使用方法。

1 IceBox介绍

IceBox是为Ice服务提供的一个易用框架。

2 demo构建

说明:本文介绍的demo程序是在Centos 7上、使用C++编程语言开发的,对应的ice、icebox版本为“3.6.4”。

沿用前文ZeroC Ice介绍中已编写的基础框架文件(即:Hello.ice、Hello.h、Hello.cpp、HelloI.h、HelloI.cpp),我们继续编写IceBox需要的其他文件。

2.5 编写IceBox服务器实例代码

说明:本节继承了前文ZeroC Ice介绍的部分内容,所以本节直接以2.5小节开始计数。

要将一个Ice服务(IceBox服务器实例)封装到IceBox服务器中,需要让这个Ice服务的服务实现类继承IceBox定义的Service接口。

Ice服务的服务实现类HelloServiceI的声明代码(HelloServiceI.h)如下:

#ifndef __HELLOSERVICEI_H__
#define __HELLOSERVICEI_H__

#include <IceBox/IceBox.h>

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 <Ice/Ice.h>
#include <HelloServiceI.h>
#include <HelloI.h>

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 <Ice/Ice.h>
#include <HelloServiceI.h>

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搭建链接:

  • 只搭建IceBox的demo,不涉及其他技术,请参考本文后续部分。
  • 使用IceBox搭建IceGrid的demo环境,相关文章点击此处

2.6 编写客户端代码

客户端代码通过IceBox中的Ice服务提供的Ice对象ID连接服务端,并调用(与该Ice对象ID)相关的方法。

客户端代码(client.cpp)如下:

#include <Ice/Ice.h>
#include <Hello.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);
        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服务的名字定义为“Hello”,此值会作为“HelloServiceI::start”函数的name参数、被传入到服务实现类HelloServiceI的start函数中,在start函数中,我们使用name参数作为了对象适配器的名字。
    注意:在本例中,Ice服务的名字与服务实现类HelloServiceI的对象适配器的名字相同,但从目前来看,这些名字对外部客户端调用IceBox服务器中的方法没什么关系(外部客户端通过Ice对象ID调用相关的方法),可理解为IceBox的内部一些逻辑关系需要。
  • Ice服务“Hello”对应的入口点为“./HelloService:create”,即调用HelloService程序(so)的create方法;
  • 参数args以“--key=value”的形式出现,所以Ice服务“Hello”运行时将读取配置文件config.service的内容,主要作用是为对象适配器“Hello”(同时也是Ice服务)设置端点。

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程序部署成功了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liitdar

赠人玫瑰,手有余香,君与吾共勉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值