在Tomcat7.0.27版本中,apache給出了WebSocket的實現,這項功能是很多Tomcat用戶一直期望的,而如今,這項功能有了。現在上我們簡單的看一下什么是WebSockets,WebSockets有什么特性和限制,以及Tomcat7如何實現的。
什么是WebSockets?
WebSocket是下一代web通信的協議,他有以下特點:
·整頁重新加載
·使用Ajax處理重新加載組件
· Comet 通信
類似于AJAX,但在服務器上不長時間持有線程。
TCP雙向通信
上面羅列的每一種特性都有優點和缺點,Tomcat6使用Comet處理機制通過HTTP實現了雙向通信。這種實現允許異步事件驅動和雙向通信,但是這種實現有一些限制:
·由于HTTP是基于請求/相應的,不是一個雙向協議,代理和其他的中介機制可能無法正常運行,而且在任何特定的時間點,只能單向傳輸。
·對于服務器端開發者來說,引入多線程開發模型會變得更加困難。
·由于不是標準的API,會導致沒有統一接口。
Servlet3.0引入了一個新的功能叫做異步servlet,Servlet 接收到請求之后,可能首先需要對請求攜帶的數據進行一些預處理;接著,Servlet 線程將請求轉交給一個異步線程來執行業務處理,線程本身返回至容器,此時 Servlet 還沒有生成響應數據,異步線程處理完業務以后,可以直接生成響應數據(異步線程擁有 ServletRequest 和ServletResponse 對象的引用),或者將請求繼續轉發給其它 Servlet。如此一來, Servlet 線程不再是一直處于阻塞狀態以等待業務邏輯的處理,而是啟動異步線程之后可以立即返回。
這個特性要比tomcat的comet處理機制強大。而這是一個標準的Servlet API,在其基礎上建立通用開發框架是非常容易的。
異步的servlet雖然解決了一部分網絡通信的需求,但是由于其缺乏雙向通信的支持,使其的適用范圍仍然有限。
WebSocket是另外一種嘗試通過HTTP支持異步、事件驅動和雙向通信的規范協議。其標準化的一個形式是JavaScript API。現在缺乏一個標準的服務器端API,Servlet3.1的專家小組正在積極的研究對此的一些基層的支持,這也是我寫這篇文章的原因。
WebSocket 是否將演變成一個完整完備的WebSocket API仍有待觀察。在此期間主要的的Servlet容器都只是支持非標準的API,Tomcat也不例外。
WebSocket給我們帶來了什么?
現在讓我們來了解一下一個WebSocket 實現給我們帶來了什么?
·通過HTTP端口實現的upgrading/switching協議雙向通信。
·以消息或者幀的方式通信。
·可以在稍作調整的代理或者其他的中介機制下工作。
WebSocket看起來是什么樣的?
從協議層面上看,WebSocket在HTTP協議的基礎上使用“”Upgrade:WebSocket ”將HTTP協議升級為WebSocket協議。這使得代理可以通過一些調整得以良好支持。一個WebSocket請求看起來如下:
2 | Host: server.example.com |
5 | Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== |
6 | Origin: http://example.com |
7 | Sec-WebSocket-Protocol: chat, superchat |
8 | Sec-WebSocket-Version: 13 |
要理解這個“Connection:upgrade ”請求頭請看服務器端返回的response包含如下信息:
5 | Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= |
現在表明協議轉換得到了許可,在此握手完成后,服務器和客戶端就脫離請求/應答模式,開始以socket方式彼此獨立的通信。
WebSocket解決了之前comet實現的所有限制么?
簡單的回答:沒有。第一,代理和中介機制在不做出調整的情況下可能仍然無法工作,所以在廣域網(WAN)部署是有問題的。第二、現在仍然沒有標準的JavaAPI支持它。然而WebSocket會在周圍的輿論壓力下逐漸解決這些問題。
另外需要注意的一點就是,每一個HTTP/TCP連接都需要初始握手,并引入一個雙向的消息往返,甚至是在你發送或者接受WebSocket協議數據之前。如果你忽視這點,這些很短的影響也會使你的WebSocket開銷變得很大。不過總的來講,WebSocket仍然是客戶端與服務器之間長連接的理想解決辦法。
一個好消息是,WebSocket比其他之前嘗試強化Web通信的解決辦法得到了更多關注,尤其是客戶端方面和跨語言支持方面,這也使得WebSocket收益很多,正在快速成長。WebSocket的另一個關于雙向通信的競爭對手是SPDY,而Tomcat對SPDY的支持也正在開發中。
總結
WebSocket的雙向通信是直接通過HTTP實現的。WebSocket API是HTML5規范的一部分,目前為止,由于規范只是草案,不同的服務器實現不同,支持也會有差異。開發WebSocket會有一定的風險,因為Java的API尚未標準化。此外,WebSocket可能無法良好的在代理和中介機制下工作。但重要的是WebSocket利用HTTP的協議升級,完成了請求/響應到TCP連接的轉換。這就給未來的代理機制了一個選擇,可以選擇在廣域網支持WebSocket與否。
Tomcat7.0.27是Tomcat發布的第一個支持WebSocket的版本。