在python中實現基於ICE框架的cl
- 2020 年 1 月 3 日
- 筆記
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)