Ice (Internet Communications Engine) 是 ZeroC 開發的高效能 RPC 框架,支援 C++、Java、C#、Python、PHP、Ruby 等語言,採用 Slice (Specification Language for Ice) 定義介面,跨語言、跨平台、支援同步/非同步/單向/雙向呼叫。
Hello.icemodule demo.slice.Hello {
interface Hello {
void printString(string s);
};
};
module 對應 Java 套件 demo.slice.Hellointerface 定義遠端操作slice2java Hello.ice 產生 _HelloDisp (伺服器骨架)、HelloPrx (客戶端代理)、HelloPrxHelper 等HelloI.javapublic class HelloI extends _HelloDisp {
public void printString(String s, Current __current) {
System.out.println(s);
}
}
_HelloDisp 抽象類printString,Current 參數提供呼叫上下文(連線資訊、請求 ID 等)HelloServer.javapublic class HelloServer {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args); // 1. 初始化 ICE 運行時
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"HelloWorldAdapter", "default -p 10000"); // 2. 建立適配器,TCP 10000 埠
Ice.Object servant = new HelloI(); // 3. 實例化 Servant
adapter.add(servant, Ice.Util.stringToIdentity("HelloWorld")); // 4. 註冊身份
adapter.activate(); // 5. 啟用適配器開始處理請求
ic.waitForShutdown(); // 6. 阻塞等待關閉信號
} catch (Exception e) {
e.printStackTrace(); status = 1;
} finally {
if (ic != null) ic.destroy(); // 7. 清理資源
}
System.exit(status);
}
}
HelloClient.javapublic class HelloClient {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args); // 1. 初始化
ObjectPrx base = ic.stringToProxy("HelloWorld:default -p 10000"); // 2. 字串代理
HelloPrx hello = HelloPrxHelper.checkedCast(base); // 3. 安全下轉型
if (hello == null) throw new Error("Invalid proxy");
for (int i = 1; i <= 10; i++) { // 4. 發送 10 條訊息
String s = "Hello,world!" + i;
hello.printString(s); // 同步 RPC 呼叫
}
} catch (Exception e) {
e.printStackTrace(); status = 1;
} finally {
if (ic != null) ic.destroy();
}
System.exit(status);
}
}
stringToProxy:從字串建立代理,格式 identity:endpointscheckedCast:執行遠端型別檢查,失敗返回 null(非拋出異常)uncheckedCast:僅本地下轉型,不驗證遠端型別(效能較高但不安全)ICE_HOME、PATHslice2java --output-dir src Hello.icejavac -cp $ICE_HOME/lib/Ice.jar src/demo/slice/Hello/*.java src/demo/ice/Hello/server/*.java src/demo/ice/Hello/client/*.javajava -cp $ICE_HOME/lib/Ice.jar:. demo.ice.Hello.server.HelloServerjava -cp $ICE_HOME/lib/Ice.jar:. demo.ice.Hello.client.HelloClientHello,world!1 ... Hello,world!10| 概念 | 說明 |
|---|---|
| Communicator | ICE 運行時核心,管理連線池、執行緒池、協議編解碼 |
| ObjectAdapter | 將 Servant 映射到身份與端點,處理請求分派 |
| Identity | 物件唯一標識 (category/name),stringToIdentity("HelloWorld") |
| Proxy | 客戶端持有的遠端物件參考,含身份與端點資訊 |
| Endpoint | 傳輸協議與地址,default -p 10000 表 TCP 10000 埠 |
| Current | 伺服端操作上下文,含連線、請求 ID、操作名、模式等 |
begin_printString() / end_printString() 或 AsyncResultObjectAdapter.add/remove、ServantLocator 動態載入IceSSL 插件ICE 以 Slice 介面定義語言為核心,實現語言中立的高效能 RPC。HelloWorld 範例展示了完整的「定義 → 編譯 → 伺服器實作 Servant → 客戶端代理呼叫」流程。掌握 Communicator、ObjectAdapter、Proxy 三大核心物件關係,是進階開發基礎。