set ICE_HOME=d:/ice-2.0.0
set PATH=%ICE_HOME%/bin;%PATH%
set PYTHONPATH=%ICE_HOME%/bin;%ICE_HOME%/python
ice的文档里有一个入门的例子,从最简单的hello world程序开始来熟悉ice。
1.编写Slice定义---Printer.ice
module Demo { interface Printer { void printString(string s); }; }; |
2.编译Slice定义
创建python程序第一步是要编译我们的Slice定义,生成python代理和骨架。
e:/myex/>slice2py Printer.ice |
生成了Printer_ice.py和Demo的子目录,现在不用关心生成的在Printer.ice里定义的Printer接口对应的Printer_ice.py的代码。
3.编写服务器
为了实现我们定义的Printer接口,我们必须创建一个子类。根据代码约定,子类必须以大写的 I 字母为后缀,所以我们定义为PrinterI:
class PrinterI(Demo.Printer): def printString(self, s, current=None): print s |
PrintI继承一个基类Demo.Printer,它是由slice2py生成的。这个基类是抽象的,并包含了一个方法printString,printString的参数有两个,一个是s,还有一个参数是current,current的类型是Ice.Current。
Server.py的其他代码和PrintI一起列出来:
import sys, traceback, Ice import Demo class PrinterI(Demo.Printer): def printString(self, s, current=None): print s status = 0 ic = None try: ic = Ice.initialize(sys.argv) adapter = ic.createObjectAdapterWithEndpoints( "SimplePrinterAdapter", "default -p 10000") object = PrinterI() adapter.add(object, Ice.stringToIdentity("SimplePrinter")) adapter.activate() ic.waitForShutdown() except: traceback.print_exc() status = 1 if ic: # Clean up try: ic.destroy() except: traceback.print_exc() status = 1 sys.exit(status) |
注意其中的一段代码结构
status = 0 ic = None try: # Server implementation here... except: traceback.print_exc() status = 1 if ic: # Clean up try: ic.destroy() except: traceback.print_exc() status = 1 sys.exit(status) |
主程序的主体包含了try块,这里是服务器的代码所在,except块则是捕获运行的异常。
代码退出之前,它要销毁communicator,这可是要点,是为了正常退出Ice run time状态
程序必须调用已经创建成功的communicator的destroy方法,否则就会造成不确定的行为。
try块的主体含有实际的服务器代码:
ic = Ice.initialize(sys.argv)
adapter = ic.createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -p 10000")
object = PrinterI()
adapter.add(object, Ice.stringToIdentity("SimplePrinter"))
adapter.activate()
ic.waitForShutdown()
代码执行的步骤:
1)通过调用Ice.initialize()初始化Ice run time状态,传递sys.argv参数是因为服务器要接受一些命令行参数,调用initialize返回的结果是一个Ice::Communicator的引用。这是Ice run time 的主句柄。
2)我们调用Communicator实例上的createObjectAdapterWithEndpoints,创建一个对象适配器,传入的参数是“SimplePrinterAdapter"(适配器的名字)和“default -p 10000",后者是要适配器用缺省协议(Tcp/ip)在端口10000处侦听进来的请求。
3)第三步,服务器端的run time已经初始化了,我们实例化一个PrinterI对象,为我们的Printer接口创建一个子类
4)通过调用适配器的add方法,通知适配器有了一个新的子类(servant)存在,传入add的参数是我们刚刚实例化的子类(servant),再加上个标识符。在这里,“SimplePrinter"是servant的名字(如果我们有多个打印机,每个打印机都可以有不同的名字,更正确的说法是,都有不同的对象标识)。
5)接下来,我们调用适配器的activate方法来激活适配器(适配器最初是在holding 状态下创建的,如果我们有多个子类(servant),它们共享一个适配器,而在所有servant实例化之前我们又不想处理请求的话,这是很有用的)。
6)最后,我们调用waitForShutdown。这个方法挂起发出调用请求的线程,直到服务器实现终止。或者通过发出一个调用关闭run time,或者是对某个信号作出响应。(现在,当我们不再需要服务器是,我们会简单地在命令行上中断它)
注意:这里尽管有一些代码,但它们对所有的服务器都是一样的。你可以把这些代码放在一个辅助类里,然后就不用再管它了。(Ice提供了这样的辅助类,叫Ice::Application)。就实际的应用代码而言,服务器只有几行代码:三行定义PrinterI,加上两行代码实例化PrinterI对象,然后向对象适配器注册它。