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" ]