首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

ICE 2.0 入門實戰:HelloWorld 服務端與客戶端完整實現

     編輯:Java 相關知識

ICE 簡介

Ice (Internet Communications Engine) 是 ZeroC 開發的高效能 RPC 框架,支援 C++、Java、C#、Python、PHP、Ruby 等語言,採用 Slice (Specification Language for Ice) 定義介面,跨語言、跨平台、支援同步/非同步/單向/雙向呼叫。

Slice 定義:Hello.ice

module demo.slice.Hello {
    interface Hello {
        void printString(string s);
    };
};
  • module 對應 Java 套件 demo.slice.Hello
  • interface 定義遠端操作
  • 編譯:slice2java Hello.ice 產生 _HelloDisp (伺服器骨架)、HelloPrx (客戶端代理)、HelloPrxHelper 等

伺服器端實現

1. Servant 實作:HelloI.java

public class HelloI extends _HelloDisp {
    public void printString(String s, Current __current) {
        System.out.println(s);
    }
}
  • 繼承 Slice 編譯器產生的 _HelloDisp 抽象類
  • 實作 printString,Current 參數提供呼叫上下文(連線資訊、請求 ID 等)

2. 伺服器啟動:HelloServer.java

public 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.java

public 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:endpoints
  • checkedCast:執行遠端型別檢查,失敗返回 null(非拋出異常)
  • uncheckedCast:僅本地下轉型,不驗證遠端型別(效能較高但不安全)

編譯與執行步驟

  1. 安裝 ICE 2.0,設定 ICE_HOME、PATH
  2. 編譯 Slice:slice2java --output-dir src Hello.ice
  3. 編譯 Java:javac -cp $ICE_HOME/lib/Ice.jar src/demo/slice/Hello/*.java src/demo/ice/Hello/server/*.java src/demo/ice/Hello/client/*.java
  4. 啟動伺服器:java -cp $ICE_HOME/lib/Ice.jar:. demo.ice.Hello.server.HelloServer
  5. 另開終端啟動客戶端:java -cp $ICE_HOME/lib/Ice.jar:. demo.ice.Hello.client.HelloClient
  6. 觀察伺服器主控台輸出 10 行 Hello,world!1 ... Hello,world!10

關鍵概念總結

概念說明
CommunicatorICE 運行時核心,管理連線池、執行緒池、協議編解碼
ObjectAdapter將 Servant 映射到身份與端點,處理請求分派
Identity物件唯一標識 (category/name),stringToIdentity("HelloWorld")
Proxy客戶端持有的遠端物件參考,含身份與端點資訊
Endpoint傳輸協議與地址,default -p 10000 表 TCP 10000 埠
Current伺服端操作上下文,含連線、請求 ID、操作名、模式等

進階主題預覽

  • 非同步呼叫 (AMI):begin_printString() / end_printString() 或 AsyncResult
  • 雙向連線:客戶端也開啟適配器,伺服器可回呼
  • 物件生命週期:ObjectAdapter.add/remove、ServantLocator 動態載入
  • 安全性:SSL/TLS、憑證驗證、IceSSL 插件
  • 服務發現:IceGrid 註冊中心、查詢、負載均衡

總結

ICE 以 Slice 介面定義語言為核心,實現語言中立的高效能 RPC。HelloWorld 範例展示了完整的「定義 → 編譯 → 伺服器實作 Servant → 客戶端代理呼叫」流程。掌握 Communicator、ObjectAdapter、Proxy 三大核心物件關係,是進階開發基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved