看一眼下面的框架,你就会发现,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会直接强制转换不做任何校验。可以根据实际情况选用咯。
Share the post "使用ICE实现RPC简单示例01"