ICE是ZeroC公司开发的一款简单高效的开源中间件平台,通过它可以快速地开发出高效、强壮、优雅的分布式的
软件。
ICE是ZeroC公司开发的一款高效的开源中间件平台,全称是Internet Communications Engine。
它的主要
设计目标是:
? 提供适用于异种环境的面向对象中间件平台。
? 提供一组完整的特性,支持广泛的领域中的实际的分布式应用的开发。
? 避免不必要的复杂性,使平台更易于
学习和使用。
? 提供一种在网络带宽、内存使用和 CPU 开销方面都很高效的实现。
? 提供一种具有内建安全性的实现,使它适用于不安全的公共
网络。
ICE支持多种编程语言:C++、Java、C#、
VB、Python、Ruby,也就是说使用ICE时我们可以让这些语言无缝沟通,不过由于ICE是用C++编写的,不管用什么语言,你都需要先用C++编译出一个ICE才行(或者下载已编译的版本)。
本篇文章以C++语言作为
演示语言,其它语言除语法不同外,使用方法非常类似。
配置ICE开发环境
首先,从zeroc/download.html 下载ICE,目前最新版本是Ice-3.3.1。下载页面里除了ICE的源码之外,也提供了VC或C++Builder的已编译安装包以及各Linux版本的RPM下载。
如果下载的是源码版本,编译方法是(以VC2005 Express为例):
1. ICE需要一些第三方库,在编译ICE之前要先编译第三方库,清单如下(它们也能在ICE官网上下载):
Berkeley DB
expat
OpenSSL
bzip2
mcpp2. 编译完上面这些库以后,把它们放到同一个目录中,然后设置环境变量THIRDPARTY_HOME:
set THIRDPARTY_HOME = d:\ice3party3. 打开$ICE/cpp/Make.rules.mak,找到CPP_COMPILER变量,改成CPP_COMPILER = VC80_EXPRESS
这个依据你的编译器决定,可以是VC60, VC80, VC80_EXPRESS, VC90, VC90_EXPRESS, BCC2007, BCC2009
4. 如果想让编译的库能脱离VC运行时库,打开$ICE/cpp/Make.rules.msvc,把CPPFLAGS = $(CPPFLAGS) -MD改成CPPFLAGS = $(CPPFLAGS) -MT。
5. 在命令行下进入$ICE/cpp目录,输入nmake -f Makefile.mak开始编译。默认是编译成Debug模式的DLL库。如果想编译成静态库,可以设置变量STATICLIBS=yes;想编译成Release模式,设置OPTIMIZE=yes。如
nmake -f Makefile.mak STATICLIBS=yes OPTIMIZE=yes如果按上面方法设置,应该不会有问题。
6. 最最后,把bin目录加入path变量,以便让系统能找到ICE的dll文件(其实主要是三个dll文件,ice33.dll、iceutil33.dll和bzip2.dll)
以后编译ICE的程序时,把上面编译好或直接下载的已编译版本的ice.lib和iceutil.lib(或Debug版本的iced.lib和iceutild.lib)链接入项目即可。
ICE的HelloWorld
跨语言的分布式
系统首先要定义一个与编程语言无关的接口描述语法,用于分布于各处的服务器与客户端之间对话。比如DCOM和CORBA使用IDL语法,
SOAP使用WSDL语法,当然还有时下流行的JSON。
ICE使用的是称为Slice(Specificatoin Language for Ice)的语法,Slice语法和C++(或
Java,C#)比较相近,只要会C++(或Java,C#)很容易就能写Slice定义了
下面是一个简单的接口的Slice定义:
1.module Demo {
2. interface Printer {
3. void printString(string s);
4. };
5.};
它定义一个Printer接口(interface),这个接口只有一个printString方法,输入参数是一个字符串(string)。最后,这个接口位于Demo模块(module)之下。
把它保存为Printer.ice后接着我们使用slice2cpp
程序依据这个Slice定义生成C++使用的头文件和对应的代理代码:
slice2cpp Printer.ice如果没提示错误,就会生成Printer.h和Printer.cpp,把这两个文件加入到服务器端项目和客户端项目后就可以互相对话了。
下表是Slice与C++的映射关系
Slice C++
#include #include
#ifndef #ifndef
#define #define
#endif #endif
module