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

J2EE企業級應用架構:Applet與Servlet通信模式深度解析

     編輯:Java 相關知識

架構背景與Sun應用模型

Sun推薦的企業級Java架構:前端Applet/HTML/JSP + 後端Servlet/EJB。關鍵挑戰在於Applet安全沙箱限制下的客戶端-服務端高效通信。

Applet安全約束分析

  • 僅能與提供Applet的主機通信(代碼源主機,非HTML宿主主機)
  • 不可讀寫本地文件系統、執行本地程序、訪問敏感環境變量
  • 不可建立/接受非代碼源主機的Socket連接
  • 繞過方案:數字簽名Applet(需用戶授信),超出本文範圍

結論:HTTP連接是唯一合法通信通道。

三種通信策略對比

策略一:HTTP文本流 —— 簡單直接

Servlet端:

public class ShowMemServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) 
            throws ServletException, IOException {
        res.setContentType("text/plain");
        PrintWriter out = res.getWriter();
        Runtime rt = Runtime.getRuntime();
        out.println(rt.freeMemory());
        out.println(rt.totalMemory());
    }
}

Applet端:

private void refresh() throws IOException {
    URL url = new URL(getCodeBase(), "/servlet/ShowMemServlet");
    URLConnection con = url.openConnection();
    con.setUseCaches(false);
    DataInputStream in = new DataInputStream(con.getInputStream());
    double free = Double.parseDouble(in.readLine());
    double total = Double.parseDouble(in.readLine());
    int percent = (int)(100 * (total - free) / total);
    meter.setLength(percent);
}

優點:簡單、穿透防火牆。缺點:複雜數據需手動解析,維護成本高。

策略二:HTTP對象流 —— 對象級透明傳輸

利用Java序列化機制,直接傳輸完整對象圖。

Servlet端:

public void doGet(HttpServletRequest req, HttpServletResponse res) 
        throws ServletException, IOException {
    OutputStream out = res.getOutputStream();
    ObjectOutputStream objOut = new ObjectOutputStream(out);
    Album album = fetchNextAlbum(); // 獲取業務對象
    objOut.writeObject(album);      // 直接序列化輸出
}

Applet端:

private Album getNextAlbum() throws IOException, ClassNotFoundException {
    URL url = new URL(getCodeBase(), "/servlet/AlbumServlet");
    URLConnection con = url.openConnection();
    con.setUseCaches(false);
    ObjectInputStream objIn = new ObjectInputStream(con.getInputStream());
    return (Album)objIn.readObject(); // 直接反序列化
}

關鍵要求:傳輸對象及其引用對象必須實現Serializable接口。
優勢:無需解析,對象邏輯復用,客戶端服務端共享領域模型。

策略三:Socket直連 —— 持久雙向通道

優點:長連接、雙向、服務端主動推送。
缺點:防火牆通常阻擋非標準端口,僅適用內網環境。
實現要點:需自定義應用層協議,建議多線程架構支持多客戶端。

架構演進與最佳實踐

三層架構對比

架構結構優點缺點
直連數據庫Applet → JDBC/RMI → DB簡單憑證暴露、防火牆穿透難、無法集群
Servlet中介Applet → Servlet → DB/EJB安全、可集群、邏輯分層增加網絡跳轉
EJB分層Applet → Servlet → EJB → DB事務/安全/分布式透明複雜度最高

推薦模式:Applet + Servlet + EJB

  1. Applet專注展現交互
  2. Servlet處理HTTP協議、會話、委派業務
  3. EJB承載事務邊界、安全授權、持久化

防火牆與部署考量

  • HTTP通信天然穿透防火牆
  • Applet類文件通過HTTP分發,無需額外端口
  • 生產環境建議:Web服務器集群 + 負載均衡 + Servlet無狀態設計

總結

Applet-Servlet通信受限於安全模型,HTTP文本流適合簡單數據,對象流適合複雜領域模型,Socket適合內網實時場景。遵循Sun應用模型分層架構,可構建安全、可擴展、可維護的企業級系統。

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