本实验主要介绍如何在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
#include
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
#include
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安装成功。