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

企業級應用中 Applet 與 Servlet 通訊架構設計指南

     編輯:Java 相關知識

前言

雖然 Applet 技術已被現代瀏覽器淘汰,但其「前端豐富客戶端 + 後端無狀態服務」的架構思想深刻影響了後續的 RIA (Rich Internet Application)、Flex/Silverlight、單頁應用 (SPA) 以及現代微服務架構。本文系統梳理 Applet-Servlet 通訊的約束、架構模式、三種核心通訊策略與最佳實務,為理解現代前後端分離架構提供歷史視角與技術借鑑。

一、核心組件與安全約束

Applet 特性與限制

  • 運行於瀏覽器 JVM(或 Java Plugin),提供豐富 GUI (AWT/Swing)
  • 沙箱限制:
    • 只能連回提供 Applet 類別的**代碼源主機** (Codebase)
    • 無法讀寫本地檔案系統
    • 無法啟動本地程序
    • 無法建立/接受任意 Socket 連線
  • 可透過數位簽章請求提權(需用戶授信),但部署複雜

Servlet 特性

  • 運行於伺服器端 Servlet 容器
  • 無安全沙箱限制,擁有完整伺服器資源存取權
  • 持久化實例,多執行緒處理並發請求,效能優於 CGI
  • 支援完整 Java EE 技術棧

二、三種架構模式比較

模式架構描述優點缺點適用場景
1. Applet 直連後端 Applet 直接用 JDBC/RMI/EJB 存取資料庫、目錄服務 開發簡單、無中介層 密碼內嵌風險、資料庫暴露防火牆外、無法叢集、維運困難 原型驗證、內網工具、教學示範
2. Applet ↔ Servlet(推薦) Applet 只負責 UI,Servlet 封裝業務邏輯與資料存取 關注點分離、安全性高、支援叢集、業務邏輯可複用 增加網路躍點、序列化開銷 企業級應用標準架構
3. Applet ↔ Servlet ↔ EJB 三層架構:Servlet 只做轉接,EJB 承載事務/安全/分散式邏輯 最大彈性、交易管理、分散式部署 複雜度高、效能開銷大、開發成本高 大型任務關鍵系統、跨系統整合

三、核心通訊策略

策略一:HTTP 文字流

最簡單、防火牆友善、除錯容易。

Servlet 端


@WebServlet("/servlet/MemoryMonitor")
public class MemoryMonitorServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws IOException {
        resp.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        Runtime rt = Runtime.getRuntime();
        out.println(rt.freeMemory());   // 第 1 行:可用記憶體
        out.println(rt.totalMemory());  // 第 2 行:總記憶體
    }
}

Applet 端


private void refreshMeter() throws IOException {
    URL url = new URL(getCodeBase(), "/servlet/MemoryMonitor");
    URLConnection conn = url.openConnection();
    conn.setUseCaches(false); // 禁用快取,確保即時資料
    
    try (DataInputStream in = new DataInputStream(conn.getInputStream())) {
        double free = Double.parseDouble(in.readLine());
        double total = Double.parseDouble(in.readLine());
        int used = (int)(total - free);
        int percent = (int)(100.0 * used / total);
        meter.setValue(percent); // 更新 UI 元件
    }
}

策略二:HTTP 物件序列化流

傳遞完整 Java 物件,保留型別與物件圖,適合複雜資料結構。

前提條件

  • 傳輸類別實作 Serializable
  • 伺服器/客戶端共用類別定義(共用 JAR)
  • JVM 版本相容(建議同版本)

Servlet 端


@WebServlet("/servlet/AlbumService")
public class AlbumServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws IOException {
        resp.setContentType("application/x-java-serialized-object");
        try (ObjectOutputStream oos = new ObjectOutputStream(resp.getOutputStream())) {
            Album album = fetchNextAlbum(); // 取得業務物件
            oos.writeObject(album);         // 序列化輸出
        }
    }
}

Applet 端


private Album getNextAlbum() throws IOException, ClassNotFoundException {
    URL url = new URL(getCodeBase(), "/servlet/AlbumService");
    URLConnection conn = url.openConnection();
    conn.setUseCaches(false);
    
    try (ObjectInputStream ois = new ObjectInputStream(conn.getInputStream())) {
        return (Album) ois.readObject(); // 反序列化還原物件
    }
}

策略三:Socket 直連

  • 優點:持久連線、雙向通訊、低延遲、自定協定
  • 缺點:防火牆通常封鎖非 80/443 埠、Applet 沙箱限制只能連 Codebase 主機、需自行處理重連/心跳/協定解析
  • 適用:內網環境、即時遊戲、股票行情推送

伺服器端 Socket 基本架構


public class SocketServer {
    public static void main(String[] args) throws IOException {
        try (ServerSocket server = new ServerSocket(8888)) {
            while (true) {
                Socket client = server.accept();
                new Thread(new ClientHandler(client)).start();
            }
        }
    }
}

class ClientHandler implements Runnable {
    private Socket socket;
    public ClientHandler(Socket socket) { this.socket = socket; }
    
    public void run() {
        try (ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
             ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {
            while (true) {
                Command cmd = (Command) in.readObject();
                Response resp = process(cmd);
                out.writeObject(resp);
                out.flush();
            }
        } catch (EOFException e) { /* 客戶端斷線 */ }
    }
}

四、現代架構演進與借鑑

Applet 時代概念現代對應技術核心改進
Applet (豐富客戶端)SPA (React/Vue/Angular) + WebAssembly無外掛、跨平台、SEO 友善、生態豐富
Servlet (後端入口)REST Controller / GraphQL Resolver無狀態、標準化介面、支援多客戶端
HTTP 文字流JSON over HTTP/HTTPS人類可讀、語言無關、工具鏈完善
Java 序列化Protobuf / Avro / MessagePack跨語言、版本演進支援、體積小、速度快
Socket 直連WebSocket / gRPC / Server-Sent Events標準化、瀏覽器原生支援、穿透代理
EJB (分散式元件)Microervices (Spring Boot / Dubbo / gRPC)獨立部署、技術異構、容器化、DevOps 整合

五、遷移建議與最佳實務

  1. 新專案嚴禁使用 Applet:瀏覽器已移除 NPAPI 支援,Java Plugin 終止生命週期
  2. 既有系統遷移路徑:
    1. 將 Applet UI 重寫為 Web 前端 (React/Vue)
    2. 保留 Servlet 邏輯,改為 REST API 輸出 JSON
    3. 引入 API Gateway 統一認證、限流、監控
    4. 逐步拆分單體 Servlet 為微服務
  3. 通訊協定選型:
    • 公開 API:JSON + REST (OpenAPI/Swagger 文檔)
    • 內部高效能:gRPC + Protobuf
    • 即時推送:WebSocket / SSE
    • 事件驅動:Kafka / RocketMQ
  4. 安全性升級:
    • OAuth 2.0 / OIDC 取代 Session 傳遞
    • HTTPS 強制、CSP、CORS 精確配置
    • 輸入驗證、輸出編碼、SQL 參數化

總結

Applet-Servlet 架構雖成歷史,但其核心思想——關注點分離、前後端契約化、無狀態服務、安全邊界劃分——在現代雲原生架構中依然閃耀。理解這段技術演進史,有助於我們在技術選型時避免重複造輪子,站在巨人肩膀上構建更穩健的系統。

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