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

发布时间:2019-09-24 08:20:59编辑:auto阅读(2038)

    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)




关键字