傳統上,Applet (客戶端) 與 Servlet (伺服器端) 透過瀏覽器間接溝通:瀏覽器請求 Servlet,Servlet 回傳 HTML。但對於即時聊天室、股票行情、線上遊戲等需即時雙向推送的場景,建立直接通訊管道至關重要。本文系統比較四種通訊架構:HTML 參數傳遞、Java.net Socket、RMI、CORBA。
Servlet 動態生成包含 <PARAM> 標籤的 HTML 頁面,Applet 透過 getParameter() 讀取。
// Servlet 端
out.write("<APPLET code=\"SimpleApplet\" width=\"225\" height=\"149\">");
out.write("<PARAM name=\"Data\" value=\"" + new Date() + "\">");
out.write("</APPLET>");
優點:部署簡單,無額外埠口、防火牆問題。
缺點:單向 (Servlet→Applet);資料靜態化,更新需重載整頁;大量/複雜資料會導致 HTML 膨脹。
直接使用 java.net.Socket (Client) 與 ServerSocket (Server) 建立 TCP 連線,自定義應用層協議。
ServerSocket server = new ServerSocket(PORT);
while (running) {
Socket client = server.accept(); // 阻塞等待連線
DataInputStream in = new DataInputStream(new BufferedInputStream(client.getInputStream()));
PrintStream out = new PrintStream(new BufferedOutputStream(client.getOutputStream()));
// 處理請求、回應...
out.close(); in.close(); client.close();
}
server.close();
Socket socket = new Socket("serverName", PORT);
OutputStream out = socket.getOutputStream();
DataInputStream in = new DataInputStream(socket.getInputStream());
// 互動...
out.close(); in.close(); socket.close();
優點:標準 API,無第三方依賴;協議完全自定,極致靈活。
缺點:需自行處理協議解析、序列化、執行緒池、連線管理、錯誤重試;防火牆常封鎖非標準埠;複雜業務邏輯開發維護成本高。
RMI 讓客戶端像呼叫本地物件方法一樣呼叫伺服器端物件方法,底層自動處理序列化 (Serialization)、存根/骨架、網路傳輸。
核心步驟:
Remote 介面,方法拋出 RemoteException。UnicastRemoteObject。Naming.rebind() 向 RMI Registry 註冊遠端物件。Naming.lookup() 取得遠端參考 (Stub) 呼叫方法。優點:程式碼清晰,物件導向透明化;支援分散式垃圾回收、安全管理器。
缺點:純 Java 環境,異構語言互通困難;RMI Registry 埠口 (預設 1099) 易被防火牆攔截;大量細粒度遠端呼叫效能不佳 (建議粗粒度介面設計)。
透過 IDL (Interface Definition Language) 定義介面,編譯器產生各語言 (Java, C++, Python...) 的存根/骨架。ORB (Object Request Broker) 處理封裝、傳輸、解封裝。
優點:語言中立,異構系統整合首選;成熟服務 (命名、事務、安全、事件) 豐富。
缺點:學習曲線陡峭;IDL 映射複雜;ORB 實作 (如 JacORB, Orbix) 體重、配置繁瑣;效能開銷大於 RMI/Socket。
| 維度 | HTML 參數 | Socket | RMI | CORBA |
|---|---|---|---|---|
| 通訊方向 | 單向 (S→A) | 雙向 | 雙向 | 雙向 |
| 資料即時性 | 靜態/重載 | 即時 | 即時 | 即時 |
| 開發複雜度 | 極低 | 高 (自管協議/執行緒) | 中 (物件透明) | 高 (IDL/ORB) |
| 跨語言支援 | 無 | 需自定協議 | 純 Java | 原生支援 |
| 防火牆友善 | 最佳 (HTTP) | 差 (需開埠) | 差 (多埠/回呼) | 差 (IIOP 埠) |
| 適用場景 | 初始化配置、簡單參數 | 高效能、自定協議、遊戲、串流 | Java 內部分散式系統、EJB 底層 | 企業級異構整合、遺留系統包裝 |
Applet 已退出歷史舞台,但「客戶端與伺服器如何高效、安全、演進地通訊」永遠是軟體架構的核心議題。理解這四種模式的權衡,有助於在現代技術棧中做出更合適的架構決策。