在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)




你可能感兴趣的:(日记,碎碎念)