Tomcat 7的WebSocket實現

jopen 10年前發布 | 58K 次閱讀 WebSocket Tomcat 應用服務器

本文覆蓋了以下內容:

1)Web通信的演進

2)WebSocket

3)WebSocket在Apache Tomcat 7的實現

4)怎樣用Jaggery開發WebSocket特性

Tomcat 7中引入了WebSocket實現。下面我們先了解WebSocket的優缺點,其次簡要介紹Apache Tomcat 7的WebSocket實現。

WebSocket的演進過程如圖所示:

Tomcat 7的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的交互情況:

f2.png
1)頭部“Connection:upgrade”
2)響應包含關鍵狀態碼101
3)表明協議交換已經證明

在客戶端和服務器之間的握手協議完成后,拋棄請求/響應通信,彼此開始獨立的互發消息。下面是我的幀:

f3.png

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()方法。

    @Override  
    protected void onOpen(WsOutbound outbound);  
    @Override  
    protected void onClose(int status);  
</div> </div> 把數據寫到客戶端
必須有StreamInbound實現類,它會引用發送器組件WsOutbound,可以簡單地通過調用來取到它:

myStreamInbound.getWsOutbound()  

還可以發送二進制數據

    public void writeBinaryData(int b);  
    public void writeBinaryMessage(ByteBuffer msgBb);  
</div> </div> 或者發送文本數據到客戶端

    public void writeTextData(char c);  
    public void writeTextMessage(CharBuffer msgBb);  
</div> </div>

注意:這些方法是互斥的。不要同時調用兩種方法,以期待既發送二進制數據,又發送文本數據。

關閉客戶端連接

關閉通道有兩種方式,分為clean方式和not clean方式。clean方式意味著已經通過TCP完成了握手協議。not clean方式意味著TCP連接被斷開,先于握手的關閉。

Jaggery WebSocket實現

下面是Jaggery WebSocket實現的序列圖:

f4.png

來自:http://blog.csdn.net/chszs/article/details/20153123

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!