在python中实现基于ICE框架的cl

ICE (Internet Communication Engine) 是zeroc公司实现的通信中间件

几大特性:

    1. 多语言支持C++、Java、python, C#等,

    2.  对分布式系统的支持,涵盖了负载均衡、位置服务、计算节点需要实时启动等特性。

    3.  提供了基于发布-订阅机制的消息组建ICEStorm

一、书写slice文件,然要按照slice规定的语法来实现

Printer.ice

module  Demo {      interface  Printer {          void printString(string  s);      };  };

二、 编译slice代码,官方教程提供了命令行的编译方式:

    ​slice2py Printer.ice

这种方法还需要额外安装slice2py命令,为了省事没有采用这种方法,我们采用的是在程序中动态的加载slice文件并编译它。

三、实现服务端代码

import sys,  traceback, Ice    #  动态加载slice文件并编译  Ice.loadSlice("./Printer.ice")    #  Demo即是从Printer.ice导出的模块名  import Demo    #  实现一个服务类  class PrinterI(Demo.Printer):      def printString(self,  s, current=None):          print s    status = 0  ic = None  try:      #  初始化ice运行环境(ice run time)  Ice.Communicator      ic = Ice.initialize(sys.argv)        #  初始化一个适配器adapter 他的名字叫"SimplePrinterAdapter"      #  采用默认协议tcp/ip 监听端口10000      adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default  -p 10000")        #  为我们的Printer接口实例化一个工作的仆人      object = PrinterI()        #  将上述实例化好的仆人添加到适配器中,他的识别码是"SimplePrinter"      adapter.add(object,  ic.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  

四、实现客户端

import sys,  traceback, Ice  import Demo    status = 0  ic = None  try:        #  初始化运行环境      ic = Ice.initialize(sys.argv)        #  获取远程printer服务的代理      base = ic.stringToProxy("SimplePrinter:default  -p 10000")        #  请求服务端确认:”这是不是 Demo::Printer的代理接口?“      printer = Demo.PrinterPrx.checkedCast(base)      if not printer:          raise RuntimeError("Invalid  proxy")        #  远程调用,看起来像本地的服务一样      printer.printString("Hello  World!")  except:      traceback.print_exc()      status = 1    if ic:      #  Clean up      try:          ic.destroy()      except:          traceback.print_exc()          status = 1    sys.exit(status)