Ice通信中間件的基礎使用

        Zeroc Ice是指Zeroc公司的ICE(Internet Communications Engine)中間件平臺。對於客戶端Client和服務端Server程序的開發提供了便利。Ice是一種面向對象的中間件平臺,它包括Ice,Ice-E,Ice Touch。Ice支持廣泛的語言,包括C++,java,C#,Python,Ruby,PHP和ActionScript,當然也包括所有的Ice服務,如Ice Grid,IceStorm等。

       

RPC(Remote Procedure Call Protocol)遠程過程調用協議


ice實例程序for-java
1:安裝配置ice
       ICE環境變量配置:
       ICE_HOME:C:\Program Files (x86)\ZeroC\Ice-3.5.0(安裝的根目錄)
       Path:%ICE_HOME%\bin
驗證是否配置成功:cmd命令輸入:slice2cpp 或者slice2cpp -v顯示配置的版本。也可以輸入slice2java或者slice2java -v顯示Ice配置的版本。

2:編寫slice定義
cmd輸入命令
cd C:\Users\madl\IdeaProjects\IceDemo1\Demo1\src\main\java(進入到Printer.ice文件對應的文件夾下)

 

slice2java Printer.ice  至此 定義slice和編譯已經完成。

 

 

批量編譯ice文件,可將所有ice文件複製到一個文件夾下,如IDEDemo

cd C:\Users\madl\IdeaProjects\IceDemo

slice2java -I. *.ice   則所有ice文件編譯ok


注意:需在工程中加入ice的jar包。

3:編寫和編譯服務器Server(  Server.java是服務端服務代理,用於接收客戶端的請求操作)
       要實現我們的Printer 接口,我們必須創建一個servant 類。按照慣例,
servant 類的名字是它們的接口的名字加上一個I 後綴,所以我們的servant

 

類叫作PrinterI,並放在PrinterI.java 源文件中(

 

PrinterI.java是對服務端實現骨架類_PrinterDisp的實現,返回時將PrinterI.java對象返回給客戶端,這裏實現的功能是直接輸出傳入的String參數) 

public class PrinterI extends _PrinterDisp {
public void printString(String s, Ice.Current current)
    {System.out.println(s);}
}

 

 

 

 服務器代碼的其餘部分在一個叫作Server.java 的源文件中。

 

 

 

 

public class Server {  
        public static void main(String[] args) {  
            int status = 0;  
            Ice.Communicator ic = null;  
            try {  
                //初使化連接,args可以傳一些初使化參數,如連接超時時間,初使化客戶連接池的數量等  
                ic = Ice.Util.initialize(args);  
                //創建名爲SimplePrinterAdapter的適配器,並要求適配器使用缺省的協議(TCP/IP偵聽端口爲10000的請求)  
                Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");  
                //實例化一個PrinterI對象,爲Printer接口創建一個服務對象  
                Ice.Object object = new PrinterI();  
                //將服務單元增加到適配器中,並給服務對象指定名稱爲SimplePrinter,該名稱用於唯一確定一個服務單元  
                adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter"));  
                //激活適配器,這樣做的好處是可以等到所有資源就位後再觸發  
                adapter.activate();  
                //讓服務在退出之前,一直持續對請求的監聽  
                ic.waitForShutdown();  
            } catch (Ice.LocalException e) {  
                e.printStackTrace();  
                status = 1;  
            } catch (Exception e) {  
                System.err.println(e.getMessage());  
                status = 1;  
            }  
            if (ic != null) {  
                // Clean up  
                //  
                try {  
                    ic.destroy();  
                } catch (Exception e) {  
                    System.err.println(e.getMessage());  
                    status = 1;  
                }  
            }  
            System.exit(status);  
        }  
    }  

 

 

 


4:編寫和編譯客戶Client(Client.java是客戶端代碼,用於向服務端發起請求,並操作返回的代理對象)

 

 

 

 public class Client {  
        public static void main(String[] args) {  
            int status = 0;  
            Ice.Communicator ic = null;  
            try {  
                //初始化Ice的runtime
                ic = Ice.Util.initialize(args);  
                //傳入遠程服務單元的名稱、網絡協議、IP及端口,獲取Printer的遠程代理,這裏使用的stringToProxy方式  
                Ice.ObjectPrx base = ic.stringToProxy("SimplePrinter:default -p 10000");  
                //通過checkedCast向下轉換,獲取Printer接口的遠程,並同時檢測根據傳入的名稱獲取的服務單元是否Printer的代理接口,如果不是則返回null對象  
                Demo.PrinterPrx printer = Demo.PrinterPrxHelper.checkedCast(base);  
                if (printer == null) throw new Error("Invalid proxy");  
                //把Hello World傳給服務端,讓服務端打印出來,因爲這個方法最終會在服務端上執行  
                printer.printString("Hello World!");  
            } catch (Ice.LocalException e) {  
                e.printStackTrace();  
                status = 1;  
            } catch (Exception e) {  
                System.err.println(e.getMessage());  
                status = 1;  
            }  
            if (ic != null) {  
                // Clean up  
                //  
                try {  
                    ic.destroy();  
                } catch (Exception e) {  
                    System.err.println(e.getMessage());  
                    status = 1;  
                }  
            }  
            System.exit(status);  
        }  
    }  

 

 


5:啓動Server,啓動Client。

 

 

 

Ice slice rpc框架 hprose
尋址信息 對象標識  可選的facet標識符
找正確的服務器  找服務器中的請求目標   確定是哪個facet

simplePrinter:default -p 10000  串化代理
直接代理
間接代理
直接綁定 間接綁定

servant   Ice對象
最多一次    Ice runtime儘可能把請求傳遞給正確的目的地,也可根據實際情況重新嘗試遞送失敗的請求。

Ice服務
  IcePrak 定位服務 用於在使用間接綁定時把符號性的適配器名解析爲協議-地址對。
  IceBox 協調服務 協調許多應用組件的啓動和停止。
  IceStorm 發佈-訂閱服務 解除client和server的耦合。本質上是事件分發交換機
  IcePatch 軟件修補服務   把軟件更新分發給客戶
  Glacier Ice的防火牆服務 能讓客戶與服務器通過防火牆安全地進行通信,且又不犧牲安全性。
 
Slice語言  使 對象接口 和 其實現 相分離的一種機制。
Slice 在客戶與服務器之間建立合約,描述應用所使用的各種類型及對象接口。這種描述與實現語言無關。
因爲Slice 描述的是接口和類型(不是實現),它是一種純粹的描述性語言;
你無法用Slice 編寫可執行語句。
Slice標識符不能有下劃線  轉義的標識符\

Ice Objects     ice對象響應客戶端的請求。

in out 
作爲out參數的時候 客戶端的賦值在服務端是取不到的 但是服務端可以對該參數賦值然後再傳遞給客戶端。
out參數一定是放在所以輸入參數的後面,不能交叉使用。

ICE異步
客戶AMI形式   服務端AMD(Asynchronous Method Dispatch) synchronous asynchronous
AMI不再顯示指定時 slice會生成callback 在客戶調用say()同步 begin_say()異步

客戶 ["ami" ] AMI_Printer_printString
服務端 ["amd" ]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章