I坐标

博客园 首页 新随笔 联系 订阅 管理

下面的例子来之ICE的说明文档。有点修改。


1、创建一个C#的Console Application


2、添加对icecs.dll的引用



3、编写Slice定义



4、生成C#代码


  1. 调用mkdir generated生成一个目录
  2. 调用 slice2cs -outputdir generated Printer.ice 生成C#代码


5、将生成的C#代码引用到项目中



6、编写执行类


下面的代码是负责执行printString的类的代码。很简单,它继承于PrinterDisp接口。



7、编写服务器执行代码


代码框架


上面的代码框架展示了如果要写一个服务器端的执行代码,大致要写那些内容。这些内容是固定的。如下的代码,就可以看到,实际的执行代码被写在try catch语句中。


填入代码


上面的代码作了如下的事情


  1. 通过Ice.Util.Initialize在运行时初始化了Ice。Initialize返回的Ice.Communicator是Ice运行时的主要句柄。
  2. 通过createObjectAdapterWithEndpoints创建了一个对象适配器,传入的参数中"SimplePrinterAdapter"是适配器的名称,"default -p 10000"命令适配器侦听TCP/IP的10000端口。
  3. 至此,我们初始化了Ice运行时,并且通过PrintI的实例创建了Printer的服务。
  4. 接下来,我们通过add方法通知适配器,一个名称为SimplePrinter的服务被加入到了服务列表中。
  5. 然后,通过Active方法激活适配器。
  6. 最后,调用waitFotShutdown,通知适配器在服务器关闭之前,适配器响应请求。如果服务器关闭,那么适配器也关闭。


编写客户端


1、新建一个Console Application项目,并加入Printer.cs文件,别忘了引用icecs.dll。



2、编写客户端执行代码


上面的代码作了如下的事情:


  1. 通过Ice.Util.Initialize在运行时初始化了Ice。
  2. 使用标示SimplePrinter:default p 10000获取了远程printer的代理。注意,SimplePrinter:default p 10000与服务器端注册的服务名称和端口是一样的。stringToProxy返回了ObjectPrx接口,这是最基本的接口。但是,要真正的和服务器通讯,使用这个接口是没用的,我们要得到的是Printer的接口。
  3. 为了得到Printer的接口,我们使用了PrinterPrxHelper.checkCase方法,这个方法向服务器发出请求:是否有一个Printer接口的代理?如果有,那么返回一个Printer类型的代理,如果没有,那么就返回null。
  4. 那么我们就有了一个Printer的代理,那么就可以使用printString方法了。


编译运行


编译后,分别运行服务器程序和客户端程序,我们可以看到如下的结果



用Java作客户端


1、ICE是跨语言的,所以,我们尝试一下。用同样的slice文件生成java文件


slice2java -outputdir generated Printer.ice


2、编写执行类PrinterI.java



我们可以看到,步骤和C#一模一样。


3、编写客户端代码



从上面可以看出,又一个和C#一模一样。当然是除去了语言特征的:D。


4、编译,运行


果然,运行成功。



最后,值得一提的是,如果把上面的PrinterI.java中的输出字符串改了,那么也不会影响最后的输出。很显然,这PrinterI.java在这个情况下仅仅是一个代理文件。

posted on 2004-12-29 18:01  I坐标  阅读(3073)  评论(6编辑  收藏  举报