看一眼下面的框架,你就会发现,ICE框架其实与CORBA很相似。但ICE更加的简洁高效,并增加了很多现代框架的特性。同时,其开发组件更加易用,不需每种语言单独下载,学习成本相对较低。
ICE是典型CS架构,与CORBA相同,ICE帮我们处理的底层的网络通信及服务定位,我们只需要告诉ICE服务在哪里,需要哪个服务,调用参数是什么,然后就坐等处理结果就好咯。
使用ICE的时候,首先要先下载ICE的开发包,下载后直接解压就好了。
ICE下载地址
在使用ICE的时候,首先要用Slice语言,定义一个接口描述文件,比如我自己写了一个很简单的接口。
JustATest.ice
module JustATest { interface iIceTest { string SayHelloTo(string s); int Add(int a, int b); }; };
然后用对应语言的转化工具,将接口描述文件,转化为对应语言。
#设置环境变量 set ICE_HOME=C:\NeoArch\ZeroC\Ice-3.6.1 set PATH=%ICE_HOME%\bin;%PATH% #转化为java slice2java JustATest.ice #转化为csharp slice2cs JustATest.ice
那ICE的Client端,是如何找到Server,并告诉Server要调用哪个服务的呢?
//首先,Server在启动的时候,要指定Adapter的名称与端口 ic.createObjectAdapterWithEndpoints("NeoTestAdapter", "default -p 1900"); //然后,在Server端的Adapter上,要做一个类似于将服务名称与服务对象绑定的动作 adapter.add(obj,Ice.Util.stringToIdentity("NeoICETest")); //当Client启动的时候,要指定端口及服务名称,这样就找到了 Ice.ObjectPrx obj = ic.stringToProxy("NeoICETest:default -p 1900");
那如果两个服务同名,只是端口不一致咋办呢?
你可以发现,无论是Client还是Server,无论是C#还是Java,都有类似的代码,你懂的。
//C# public static readonly string[] ids__ = { "::Ice::Object", "::JustATest::iIceTest" };
//java public static final String[] __ids = { "::Ice::Object", "::JustATest::iIceTest" };
在client段调用的时候,有checkedCast和uncheckedCast两种转换方式,说白了,checkedCast会先校验接口是否匹配,而uncheckedCast会直接强制转换不做任何校验。可以根据实际情况选用咯。