Tomcat 7的WebSocket實現
本文覆蓋了以下內容:
1)Web通信的演進
2)WebSocket
3)WebSocket在Apache Tomcat 7的實現
4)怎樣用Jaggery開發WebSocket特性
Tomcat 7中引入了WebSocket實現。下面我們先了解WebSocket的優缺點,其次簡要介紹Apache Tomcat 7的WebSocket實現。
WebSocket的演進過程如圖所示:
要知道在Tomcat 6中要實現雙向HTTP通信,需要使用Tomcat的Comet處理模塊。Comet有以下局限:
1)HTTP協議本身是請求/響應協議,而不是雙向協議
2)代理和其它中間媒介不會工作的很好
3)在任何給定的時間只有某個方向的數據包傳輸
4)Servlet開發者要使用多線程很難
Servlet 3.0版引入了一個新特征:異步Servlet。我們把它與客戶端的Ajax調用進行比較。異步Servlet會把請求懸掛起,直到響應準備好交付,無需在容器中使用worker線程。WebSockets是另一個嘗試標準化的技術,它支持HTTP之上的異步、事件驅動和全雙工通信。
WebSocket給我們帶來了如下特性:
1)通過升級/交換HTTP協議,在HTTP之上提供全雙工通信
2)基于消息/幀的通信
3)可以與代理和中間媒介一起工作
4)還可以不與代理和中間媒介一起工作
WebSocket的優點:
1)WebSocket是理想的,客戶端和服務器之間不再需要長期運行的會話
2)WebSocket是HTTP協議之上的全雙工通信
3)由于WebSocket是HTTP握手初始化之后的TCP之上的協議,所以你只需做兩件事:
發送消息
接收消息下面來看一下WebSocket的交互情況:
1)頭部“Connection:upgrade”
2)響應包含關鍵狀態碼101
3)表明協議交換已經證明
在客戶端和服務器之間的握手協議完成后,拋棄請求/響應通信,彼此開始獨立的互發消息。下面是我的幀:
Tomcat是怎樣實現WebSocket的
1)要開始使用WebSocket,你必須繼承Tomcat的WebSocket類
2)編寫自己的類,它繼承WebSocketServlet類(由于這是一個Servlet,因此必須把它映射到URL)
3)實現一個消息監聽器類,由于它繼承自WebSocketServlet類,因此需要自己實現createWebSocketInbound()方法
此方法能夠用于監聽事件。有兩個必須有的方法:
一是 protected void onBinaryData(InputStream inStream);
二是protected void onTextData(Reader reader);
當WebSocket打開或關閉時,如果你希望收到通知,只需簡單地重寫onOpen()方法和onClose()方法。