傳統的輪詢與長連接技術雖能實現服務器推送,但頻繁的 HTTP 請求會佔用大量伺服器資源,且實時性難以保障。HTML5 WebSocket 提供全雙工通訊,僅需一次握手即可建立持久連接,極大降低開銷,成為即時通訊、實時協作等場景的首選。
org.apache.catalina.websocket 實現catalina.jar、tomcat-coyote.jar@WebServlet(urlPatterns = {"/message"})
public class WebSocketMessageServlet extends org.apache.catalina.websocket.WebSocketServlet {
public static int ONLINE_USER_COUNT = 1;
public String getUser(HttpServletRequest request) {
return (String) request.getSession().getAttribute("user");
}
@Override
protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
return new WebSocketMessageInbound(this.getUser(request));
}
}
WebSocketMessageInbound繼承 MessageInbound,覆寫三大生命週期方法:
onOpen:用戶上線,廣播加入通知,發送當前在線列表給新用戶onClose:用戶下線,從連接池移除,廣播離開通知onTextMessage:接收聊天消息,廣播給所有在線用戶WebSocketMessageInboundPool使用 Map<String, WebSocketMessageInbound> 管理在線連接,提供:
addMessageInbound / removeMessageInbound:增刪連接sendMessage / sendMessageToUser:廣播與單發getOnlineUser:獲取在線用戶列表index.jsp若 Session 無用戶則自動生成「游客 + 序號」並存入 Session,隨後載入 ExtJS 與自定義 websocket.js。
websocket.jsMessageContainer:基於 Ext.view.View 的消息展示組件,支援自我/遠端消息樣式區分與自動滾動Ext.onReady:初始化 WebSocket 連接(ws://localhost:8080/WebSocket/message),綁定 onopen/onerror/onclose/onmessage 事件message(聊天)、get_online_user(初始列表)、user_join/leave(上下線動態更新用戶樹)websocket.send() 發送webapps/項目/WEB-INF/lib 下的 catalina.jar、tomcat-coyote.jar 刪除,否則會拋出 Could not initialize class WebSocketMessageServlet。createWebSocketInbound 方法包含 HttpServletRequest 參數,舊版本無此參數,需下載對應版本 Tomcat。本例展示了基於 Tomcat 原生 WebSocket 實現的輕量級聊天室,具備實時推送、用戶狀態感知、ExtJS 豐富界面等特性。後續可結合 Spring WebSocket API 實現跨容器部署,或整合 WebRTC 拓展語音/視頻聊天功能。