首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Tomcat 與 Jetty 的 WebSocket 支持對比:從 BIO 到 NIO 的架構演進

     編輯:C++ 入門

Tomcat 與 Jetty 的 WebSocket 支持深度對比

公司項目需要引入 WebSocket,調研主流容器支持情況。記錄關鍵發現與代碼示例。

Tomcat:JSR-356 標準實現

版本差異:

  • Tomcat 8:完整支持 JSR-356 (Java API for WebSocket),標準化、穩定
  • Tomcat 7:僅支持早期 WebSocket 協議草案,不兼容 JSR-356
  • 建議: 能用 Tomcat 8+ 盡量用

代碼極簡(僅需 tomcat-embed-websocket.jar):

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/websocket")
public class WebSocketTest {
    @OnMessage
    public void onMessage(String message, Session session) throws IOException, InterruptedException {
        System.out.println("Received: " + message);
        session.getBasicRemote().sendText("First server message");
        for (int i = 0; i < 3; i++) {
            Thread.sleep(5000);
            session.getBasicRemote().sendText("Intermediate message: " + i);
        }
        session.getBasicRemote().sendText("Last server message");
    }
    @OnOpen  public void onOpen()  { System.out.println("Client connected"); }
    @OnClose public void onClose() { System.out.println("Connection closed"); }
}

Jetty:NIO 架構原生支持長連接

核心差異:

特性Tomcat (BIO)Jetty (NIO)
線程模型每連接一線程少量線程處理海量連接
WebSocket 適用性連接數少時可接受大規模長連接(聊天、推送)首選
Servlet 基類HttpServletWebSocketServlet

依賴: jetty-util.jar + jetty-websocket.jar

三類核心代碼結構:

// 1. Servlet 入口:繼承 WebSocketServlet
public class ReverseAjaxServlet extends WebSocketServlet {
    private Endpoints endpoints = new Endpoints();
    @Override public WebSocket doWebSocketConnect(HttpServletRequest req, String protocol) {
        return endpoints.newEndpoint();
    }
}

// 2. 連接管理器:廣播、註冊、移除
class Endpoints {
    private Queue queue = new ConcurrentLinkedQueue<>();
    public WebSocket newEndpoint() { return new Endpoint(this); }
    void offer(Endpoint ep) { queue.offer(ep); }
    void remove(Endpoint ep) { queue.remove(ep); }
    void broadcast(String data) { /* 遍歷發送 */ }
}

// 3. 端點實現:OnTextMessage 接口
class Endpoint implements WebSocket.OnTextMessage {
    private Connection conn;
    public void onOpen(Connection c) { conn = c; endpoints.offer(this); }
    public void onClose(int code, String msg) { endpoints.remove(this); }
    public void onMessage(String data) { endpoints.broadcast(data); }
}

測試工具推薦

Chrome 擴展 WebSocket Client:輕鬆建立連接、發送消息、查看響應,無需寫客戶端代碼。

選型建議

  • 標準化、維護性優先 → Tomcat 8+ (JSR-356)
  • 超大規模長連接、高併發推送 → Jetty (NIO)
  • 舊項目維護 → 評估遷移成本
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved