中间件ICE提供了了动态绑定(Binding)端口的服务ICEPACK(高版本中已更名为ICEGRID,用法类似),这样可避免在程序中指定连接端口,而将端口信息外部化,增加应用的灵活性。
ICEPACK中保存连接信息的结点称为Registry(作用类似于互联网中的DNS), server启动时首先向Registry注册自己所提供的adapter有自己的通讯端点,当有client要发起RPC时,先向Registry询问自己所要使用的adapter所在的位置,使用server已注册的端点时行通讯。
我这里使用的是ice2.1.0,开发语言为JAVA.
1.首先配置Registry的配置文件
假设配置文件为/opt/ripper/registry/registry.cfg,其内容如下:
IcePack.Registry.Client.Endpoints=tcp -p 32769 IcePack.Registry.Server.Endpoints=tcp IcePack.Registry.Internal.Endpoints=tcp IcePack.Registry.Data=/opt/ripper/registry IcePack.Registry.DynamicRegistration=1
其中的一些属性用来指定端点信息,需要注意的是IcePack..Registry.Client.Endpoints必需使用手动指定的端口号,该属性的作用是指定IcePack locator 服务端点。同时在客户端中Ice.Default.Locator也要使用相同的端口。
IcePack.Registry.Data 用来指定注册器数据库的路径。此数据文件用来存储adapter与基所对就的Server位置信息。
IcePack.Registry.DynamicRegistration 用来指定是否允许动态的注册对象适配器,0表示不允许,非0表允许。
这里要说明一下,有三种向Registry注册adapter及端点信息的方法,一是使用icepacknode,另一个是使用iceadmin工具,前两种被称为非动态注册,第三种是在server程序中向Registry注册,此被称为动态注册。
2.配置客户端(Configuring the Client)
客户端的需要很少的配置,仅需要配置Ice.Default.Locator属性,该属性用于使用客户端指向Rigistry 上的定位器(Locator)。
配置文件为 /opt/ripper/client.cfg
Ice.Default.Locator=IcePack/Locator:tcp -h 10.10.110.1 -p 32769
3.配置服务器(Configuring the Server)
这里使用/opt/ripper/server.cfg来作为服务器端的配置文件,其包含以下内容:
EncoderAdapter.AdapterId=EncoderAdapter EncoderAdapter.Endpoints=tcp Ice.Default.Locator=IcePack/Locator:tcp-h 10.10.110.1 -p 32769
EncoderAdapter.AdapterId 用来提供客户端在间接绑定中所要使用代理的对象适配器标识符。
EncoderAdapter.Endpoints 用来指定对象适配器的端点,如果不指定端口就意味着使用系统动态分配的端口。
Ice.Default.Locator 注册器的地址
Ice.Communicator ic=null; try{ ic=Ice.Util.initialize(args); Ice.ObjectAdapter adapter=ic.createObjectAdapter("EncorderAdapter"); Ice.Object object=new ServantI(); adapter.add(object,Ice.Util.stringToIdentity("Encord"); adapter.activate(); ic.waitForShutdown(); }catch(Ice.LocalException e){ }catch(Exception e){ }
5.client的JAVA代码如下:
Ice.Communicator ic=null;
Ice.Properties prop=null;
try{
prop=Ice.Util.createProperties();
ic=Ice.Util.initializeWithProperties(args,prop);
Ice.ObjectPrx base=ic.stringToProxy("Encord@EncorderAdapter");
ServantPrx servantprx=ServantPrxHelper.checkedCast(base);
//至此客户端获得了服务器端ServantI 的代理,便可以执行远程调用了。
6.启动注册器Registry)
在Registry结点上执行如下命令,注意Registry可以在单独的结点上,也可以和Client或Server在同一个结点上。
$icepackregistry --Ice.Config=/opt/ripper/registry/registry.cfg
7.启动服务器
$ ./server --Ice.Config=/opt/ripper/server.cfg
8.启动客户端
$./client --Ice.Config= /opt/ripper/client.cfg
至此,一个动态绑定的ICE实例便完成了。