免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 18001 | 回复: 10
打印 上一主题 下一主题

给工作内容与通讯有关的朋友推荐下zeroc的ICE中间件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-05 16:31 |只看该作者 |倒序浏览
好久没发帖了,来C++版打个广告:wink:
关于ICE的介绍我也说不了,大家百度看看就行了。
试用方法和一些slice的语法可以参考
http://masterkey.javaeye.com/blog/183307
ZeroC ICE之旅------C++

从今年6月份开始接触ICE,用了几个月发现对于面向对象的通讯方面的开发来说,确实很方便。咱也不是五毛专门来做广告的。
废话不多说,就挑点印象比较深的说说。

(1):模型简单,通讯采用回调函数的方式设计,或者说是RPC,远程过程调用也行,说最朴素点,就是这样,A机器和B机器通过
一个用slice语法书写的ice文件来定义通讯中的接口和对象(也就是数据结构和函数接口),比如定义了一个接口f,对象o,当客户端A调用
f(o)这个方法时,服务端B的f(o)方法就会被调用,当然B端f(o)中的数据是A端传递的;当然,对于发起端A来说,f这个接口是通过ice文件定义
自动生成的,不需要任何处理,只需要在通讯时,构造好数据对象,直接调用就行。对于服务端,需要定义一个消息处理函数f,也就是说需要实现ice文件中定义的接口,这样,在客户端调用时,服务端就能对数据按照自己理想的方式进行处理了。

(2):试用方便,稳定,支持多平台多语言互通。要通讯时只需要构造好通讯约定好的proxy字符串,字符串包含了通讯目的地IP,端口,试用的协议,超时机制等等,很多配置,可以阅读ICE的文档。

(3):感受,如果不是非要用C语言完成工作,我现在基本上都会选择ICE,呵呵,当然,也有人把ICE的C++接口封装供C来调用。说句偷懒而且很有可能被BS的话,现在宁可忘记socket,呵呵,自己之前做过一个东西,用TCP做的还多平台接口,前几天全部抽空在周末改成ICE的了,windows的客户端和linux服务器程序通讯,基本上不用考虑不通OS引起的差异。代码结构简化了好多,只需要把注意力放在业务处理上。

最后把自己整理得一个ICE的安装文档(也是借鉴互联网上别的朋友的帖子,我的是64位机器上的)发上来,感兴趣的朋友可以参考下。
软件包:
bzip2系统已经自带,不需安装
Ice-3.3.1.tar.gz
expat-2.0.1.tar.gz            
openssl-0.9.8k.tar.gz
db-4.6.21.NC.tar.gz
mcpp-devel-2.7.2-1ice.src.rpm

安装目录为/usr/local/component

(1)安装mcpp
rpm -i mcpp-devel-2.7.2-1ice.src.rpm
cd /usr/src/redhat/SPECS/
rpmbuild -bp mcpp-devel.spec
cd /usr/src/redhat/BUILD/mcpp-2.7.2/
然后就可以进行安装了。
./configure --prefix=/usr/local/component/mcpp CFLAGS=-fPIC -enable-mcpplib -enable-shared
make
make install
如果是64位机器的话, 还要把安装目录下的
lib目录的内容拷贝到安装目录下的一个新建的名为lib64目录下。
(2)安装expat
tar -zxvf expat-2.0.1.tar.gz
cd expat-2.0.1
./configure --prefix=/usr/local/component/expat
make
make install
(3)安装OpenSSL
tar -zxvf openssl-0.9.8k.tar.gz
cd openssl-0.9.8k
./config --prefix=/usr/local/component/openssl
make
make install
(4)安装DB
tar -zxvf tar -zxvf db-4.6.21.NC.tar.gz
cd cd db-4.6.21.NC
cd build_unix
../dist/configure --prefix=/usr/local/component/db -enable-cxx
make
make install
同样,DB的lib目录也拷贝一份lib64
(5)ICE安装
tar -zxvf Ice-3.3.1.tar.gz
cd Ice-3.3.1
cd cpp
vi config/Make.rules
修改Make.rules里面的各个第三方软件的路径
具体的有:
prefix                   ?= /usr/local/component/Ice-$(VERSION)
embedded_runpath_prefix  ?= /usr/local/component/Ice-$(VERSION_MAJOR).$(VERSION_MINOR)
DB_HOME         ?= /usr/local/component/db
EXPAT_HOME              ?= /usr/local/component/expat
OPENSSL_HOME            ?= /usr/local/component/openssl
MCPP_HOME               ?= /usr/local/component/mcpp
保存
然后
make
make install
make test


[ 本帖最后由 duanjigang 于 2009-11-5 16:53 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-05 16:34 |只看该作者
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 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-11-05 16:37 |只看该作者
想学ACE,ICE的网络中间件的架构。

论坛徽章:
0
4 [报告]
发表于 2009-11-05 16:52 |只看该作者
原帖由 peidright 于 2009-11-5 16:37 发表
想学ACE,ICE的网络中间件的架构。

呵呵,以前也这样想过,现在就是纯粹应用,不看了,有时间看看linux内核代码还是蛮有意思的

论坛徽章:
0
5 [报告]
发表于 2011-09-22 16:25 |只看该作者
回复 1# duanjigang
顶一下

论坛徽章:
1
技术图书徽章
日期:2014-07-11 16:30:58
6 [报告]
发表于 2011-09-22 16:38 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2011-10-14 08:18 |只看该作者
如果同时开发客户端和服务器端,这种中间件非常好用

但是通常项目比较大,服务器端是另一帮人开发的,

你没办法说服他们用ICE, 相对而言ACE则没这问题

论坛徽章:
0
8 [报告]
发表于 2011-10-14 08:43 |只看该作者
这个东西我以前也看过,但是很快发现其有一些问题。
一是跨平台,基本上就是windows和linux,而且linux还是主要是红帽和suse,其他的Solaris勉强可以用,aix问题多多,其他的没编译过去。
二是使用过程中升级过一次,结果代码编译不过去了,检查后才发现他的某些接口定义变了。。。

通信而已,还是用ws吧,省心。。。。

论坛徽章:
0
9 [报告]
发表于 2011-11-02 09:13 |只看该作者
项目中正准备采用,正在选型看是ACE,还是ICE呢

论坛徽章:
0
10 [报告]
发表于 2014-02-24 15:42 |只看该作者
你好,请问,最后选择了什么呢?最近公司也在选择,初次接触,不知道如何选择啊。。。
benney1981 发表于 2011-11-02 09:13
项目中正准备采用,正在选型看是ACE,还是ICE呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP