本实验主要介绍如何在Ubuntu 14.04系统上编译安装ZeroC ICE,首先介绍一下ZeroC ICE。
ZeroC ICE是ZeroC公司开发的一套RPC中间件平台,号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯屏蔽。因此相比Corba,DCOM,SOAP,J2EE等的中间件技术,自然是集众多优点于一身,而却没有他们的缺点。
目前ICE平台中包括Ice,Ice-E,Ice Touch。
Ice为主流平台设计,包括Windows和Linux,支持广泛的语言,包括C++,Java,C#(和其他.Net的语言,例如Visual Basic),Python,Ruby,PHP和ActionScript。也包括所有的ICE服务,例如Ice Grid,IceStorm等。
Ice-E是Ice在资源受限的平台上的一个实现,支持C++和嵌入式操作系统,例如Windows CE,Linux。Ice-E本身不包含任何服务,但是可以利用在Ice上提供的各种服务。因此,通过Ice-E,移动设备也能无缝的集成到分布式系统中。
Ice Touch是为iphone和ipod touch开发的版本,包括Object-C映射,支持Iphone OS,并为MAC OS X开发图形界面应用程序提供完整的Cocoa框架的访问。
下面是编译、安装ZeroICE的主要流程:
#下载源码
$ git clone https://github.com/zeroc-ice/ice.git
#安装依赖库libmcpp、openssl
$ sudo apt-get install libmcpp-dev libssl-dev libbz2-dev libexpat1-dev liblmdb-dev
$ cd ice-master
$ make -j4 V=s
$ sudo make install
编译安装成功后,目标文件安装在/opt目录下。测试运行过程如下:
1、编写文件demo.icemodule demo { interface printer { void printerstr(string msg); }; };
server.cpp程序
#include <Ice/Ice.h> #include <demo.h> using namespace demo; using namespace std; class PrinterI : public printer { public: virtual void printerstr(const string & s, const Ice::Current &); }; void PrinterI:: printerstr(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) ic->destroy(); return status; }
client.cpp
#include <Ice/Ice.h> #include <demo.h> using namespace demo; using namespace std; int main(int argc, char * argv[]) { int status = 0; Ice::CommunicatorPtr ic; try { ic = Ice::initialize(argc, argv); Ice::ObjectPrx base = ic->stringToProxy( "SimplePrinter:default -p 10000"); printerPrx printer = printerPrx::checkedCast(base); if (!printer) throw "Invalid proxy"; printer->printerstr("Hello World!"); } 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、生成demo.cpp
$ slice2cppdemo.ice
$ ls
demo.ice demo.h demo.cpp
3、编译运行
$ g++ -I. -oserver demo.cpp server.cpp -lIce -lpthread
$ g++ -I. -oclient demo.cpp client.cpp –lIce -lpthread
$ ./server
$./client
Hello World!
成功在server端打印Hello World!信息表示ZeroC ICE安装成功。