python for ice入门(1)

 

先从ice网站上下载ice 2.0 for windows,这个版本要求安装dotnet,安装完ice后,要设置一下系统变量
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对象,然后向对象适配器注册它。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值