电竞比分网-中国电竞赛事及体育赛事平台

分享

Tomcat 7 中的 WebSocket

 陳湖雨_毓 2013-04-25
在Tomcat7.0.27版本中,apache給出了WebSocket的實現(xiàn),這項功能是很多Tomcat用戶一直期望的,而如今,這項功能有了?,F(xiàn)在上我們簡單的看一下什么是WebSockets,WebSockets有什么特性和限制,以及Tomcat7如何實現(xiàn)的。

什么是WebSockets?

    WebSocket是下一代web通信的協(xié)議,他有以下特點:
    ·整頁重新加載
    ·使用Ajax處理重新加載組件
    · Comet 通信
    類似于AJAX,但在服務(wù)器上不長時間持有線程。 
    TCP雙向通信
    上面羅列的每一種特性都有優(yōu)點和缺點,Tomcat6使用Comet處理機(jī)制通過HTTP實現(xiàn)了雙向通信。這種實現(xiàn)允許異步事件驅(qū)動和雙向通信,但是這種實現(xiàn)有一些限制:
    ·由于HTTP是基于請求/相應(yīng)的,不是一個雙向協(xié)議,代理和其他的中介機(jī)制可能無法正常運行,而且在任何特定的時間點,只能單向傳輸。
    ·對于服務(wù)器端開發(fā)者來說,引入多線程開發(fā)模型會變得更加困難。
    ·由于不是標(biāo)準(zhǔn)的API,會導(dǎo)致沒有統(tǒng)一接口。
    Servlet3.0引入了一個新的功能叫做異步servlet,Servlet 接收到請求之后,可能首先需要對請求攜帶的數(shù)據(jù)進(jìn)行一些預(yù)處理;接著,Servlet 線程將請求轉(zhuǎn)交給一個異步線程來執(zhí)行業(yè)務(wù)處理,線程本身返回至容器,此時 Servlet 還沒有生成響應(yīng)數(shù)據(jù),異步線程處理完業(yè)務(wù)以后,可以直接生成響應(yīng)數(shù)據(jù)(異步線程擁有 ServletRequest 和ServletResponse 對象的引用),或者將請求繼續(xù)轉(zhuǎn)發(fā)給其它 Servlet。如此一來, Servlet 線程不再是一直處于阻塞狀態(tài)以等待業(yè)務(wù)邏輯的處理,而是啟動異步線程之后可以立即返回。 
    這個特性要比tomcat的comet處理機(jī)制強(qiáng)大。而這是一個標(biāo)準(zhǔn)的Servlet API,在其基礎(chǔ)上建立通用開發(fā)框架是非常容易的。
    異步的servlet雖然解決了一部分網(wǎng)絡(luò)通信的需求,但是由于其缺乏雙向通信的支持,使其的適用范圍仍然有限。
    WebSocket是另外一種嘗試通過HTTP支持異步、事件驅(qū)動和雙向通信的規(guī)范協(xié)議。其標(biāo)準(zhǔn)化的一個形式是JavaScript API?,F(xiàn)在缺乏一個標(biāo)準(zhǔn)的服務(wù)器端API,Servlet3.1的專家小組正在積極的研究對此的一些基層的支持,這也是我寫這篇文章的原因。
    WebSocket 是否將演變成一個完整完備的WebSocket API仍有待觀察。在此期間主要的的Servlet容器都只是支持非標(biāo)準(zhǔn)的API,Tomcat也不例外。

WebSocket給我們帶來了什么?

    現(xiàn)在讓我們來了解一下一個WebSocket 實現(xiàn)給我們帶來了什么?
    ·通過HTTP端口實現(xiàn)的upgrading/switching協(xié)議雙向通信。
    ·以消息或者幀的方式通信。
    ·可以在稍作調(diào)整的代理或者其他的中介機(jī)制下工作。

WebSocket看起來是什么樣的?

    從協(xié)議層面上看,WebSocket在HTTP協(xié)議的基礎(chǔ)上使用“”Upgrade:WebSocket ”將HTTP協(xié)議升級為WebSocket協(xié)議。這使得代理可以通過一些調(diào)整得以良好支持。一個WebSocket請求看起來如下:
1GET /chat HTTP/1.1
2Host: server.
3Upgrade: websocket
4Connection: Upgrade
5Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
6Origin: http://
7Sec-WebSocket-Protocol: chat, superchat
8Sec-WebSocket-Version: 13

 

要理解這個“Connection:upgrade ”請求頭請看服務(wù)器端返回的response包含如下信息:
1HTTP/1.1 101
2Switching Protocols
3Upgrade: websocket
4Connection: Upgrade
5Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

 

    現(xiàn)在表明協(xié)議轉(zhuǎn)換得到了許可,在此握手完成后,服務(wù)器和客戶端就脫離請求/應(yīng)答模式,開始以socket方式彼此獨立的通信。

WebSocket解決了之前comet實現(xiàn)的所有限制么?

    簡單的回答:沒有。第一,代理和中介機(jī)制在不做出調(diào)整的情況下可能仍然無法工作,所以在廣域網(wǎng)(WAN)部署是有問題的。第二、現(xiàn)在仍然沒有標(biāo)準(zhǔn)的JavaAPI支持它。然而WebSocket會在周圍的輿論壓力下逐漸解決這些問題。
    另外需要注意的一點就是,每一個HTTP/TCP連接都需要初始握手,并引入一個雙向的消息往返,甚至是在你發(fā)送或者接受WebSocket協(xié)議數(shù)據(jù)之前。如果你忽視這點,這些很短的影響也會使你的WebSocket開銷變得很大。不過總的來講,WebSocket仍然是客戶端與服務(wù)器之間長連接的理想解決辦法。
    一個好消息是,WebSocket比其他之前嘗試強(qiáng)化Web通信的解決辦法得到了更多關(guān)注,尤其是客戶端方面和跨語言支持方面,這也使得WebSocket收益很多,正在快速成長。WebSocket的另一個關(guān)于雙向通信的競爭對手是SPDY,而Tomcat對SPDY的支持也正在開發(fā)中。

總結(jié)

    WebSocket的雙向通信是直接通過HTTP實現(xiàn)的。WebSocket API是HTML5規(guī)范的一部分,目前為止,由于規(guī)范只是草案,不同的服務(wù)器實現(xiàn)不同,支持也會有差異。開發(fā)WebSocket會有一定的風(fēng)險,因為Java的API尚未標(biāo)準(zhǔn)化。此外,WebSocket可能無法良好的在代理和中介機(jī)制下工作。但重要的是WebSocket利用HTTP的協(xié)議升級,完成了請求/響應(yīng)到TCP連接的轉(zhuǎn)換。這就給未來的代理機(jī)制了一個選擇,可以選擇在廣域網(wǎng)支持WebSocket與否。
Tomcat7.0.27是Tomcat發(fā)布的第一個支持WebSocket的版本。
OSChina.NET/原創(chuàng)翻譯,原文鏈接

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多