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