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