在python中实现基于ICE框架的client、server模型


 

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

几大特性:

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

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

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

 

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

Printer.ice

1 2 3 4 5 module Demo { interface Printer { void printString(string s); }; };

 

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

?slice2py Printer.ice

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

?

三、实现服务端代码

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 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

 

四、实现客户端

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 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)

 

 


评论关闭