下面的例子来之ICE的说明文档。有点修改。
1、创建一个C#的Console Application
2、添加对icecs.dll的引用
3、编写Slice定义
4、生成C#代码
- 调用mkdir generated生成一个目录
- 调用 slice2cs -
outputdir generated Printer.ice 生成C#代码
5、将生成的C#代码引用到项目中
6、编写执行类
下面的代码是负责执行printString的类的代码。很简单,它继承于PrinterDisp接口。
7、编写服务器执行代码
代码框架
上面的代码框架展示了如果要写一个服务器端的执行代码,大致要写那些内容。这些内容是固定的。如下的代码,就可以看到,实际的执行代码被写在try catch语句中。
填入代码
上面的代码作了如下的事情
- 通过Ice.Util.Initialize在运行时初始化了Ice。Initialize返回的Ice.Communicator是Ice运行时的主要句柄。
- 通过createObjectAdapterWithEndpoints创建了一个对象适配器,传入的参数中"SimplePrinterAdapter"是适配器的名称,"default -p 10000"命令适配器侦听TCP/IP的10000端口。
- 至此,我们初始化了Ice运行时,并且通过PrintI的实例创建了Printer的服务。
- 接下来,我们通过add方法通知适配器,一个名称为SimplePrinter的服务被加入到了服务列表中。
- 然后,通过Active方法激活适配器。
- 最后,调用waitFotShutdown,通知适配器在服务器关闭之前,适配器响应请求。如果服务器关闭,那么适配器也关闭。
编写客户端
1、新建一个Console Application项目,并加入Printer.cs文件,别忘了引用icecs.dll。
2、编写客户端执行代码
上面的代码作了如下的事情:
- 通过Ice.Util.Initialize在运行时初始化了Ice。
- 使用标示SimplePrinter:default
p 10000获取了远程printer的代理。注意,SimplePrinter:defaultp 10000与服务器端注册的服务名称和端口是一样的。stringToProxy返回了ObjectPrx接口,这是最基本的接口。但是,要真正的和服务器通讯,使用这个接口是没用的,我们要得到的是Printer的接口。 - 为了得到Printer的接口,我们使用了PrinterPrxHelper.checkCase方法,这个方法向服务器发出请求:是否有一个Printer接口的代理?如果有,那么返回一个Printer类型的代理,如果没有,那么就返回null。
- 那么我们就有了一个Printer的代理,那么就可以使用printString方法了。
编译运行
编译后,分别运行服务器程序和客户端程序,我们可以看到如下的结果
用Java作客户端
1、ICE是跨语言的,所以,我们尝试一下。用同样的slice文件生成java文件
slice2java -outputdir generated Printer.ice
2、编写执行类PrinterI.java
我们可以看到,步骤和C#一模一样。
3、编写客户端代码
从上面可以看出,又一个和C#一模一样。当然是除去了语言特征的:D。
4、编译,运行
果然,运行成功。
最后,值得一提的是,如果把上面的PrinterI.java中的输出字符串改了,那么也不会影响最后的输出。很显然,这PrinterI.java在这个情况下仅仅是一个代理文件。