轉自:http://www.open-open.com/news/view/1b01d43web
在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)部署是有問題的。第2、如今仍然沒有標準的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的版本。