什么是Websocket?
Websocket是一個獨立於http的實時通信協議,最初是在HTML5中被引用進來的,在HTML5規范中作為瀏覽器與服務器的核心通信技術被嵌入到瀏覽器中。WebSocket的出現使得瀏覽器提供對Socket的支持成為可能,從而在瀏覽器和服務器之間提供了一個基於TCP連接的雙向通道。
在websocket誕生之前,服務端想要向客戶端推送數據只能通過客戶端向服務端主動發送請求才能獲得。在構建實時Web應用時,最常用的就是輪詢 (Polling)和Comet技術,而Comet技術實際上是輪詢技術的改進,又可細分為兩種實現方式,一種是長輪詢機制,一種稱為流技術。
輪詢:這是最早的一種實現實時 Web 應用的方案。客戶端以一定的時間間隔向服務端發出請求,以頻繁請求的方式來保持客戶端和服務器端的同步。
長輪詢:長輪詢則是針對普通輪詢的這種缺陷的一種改進方案,其具體實現方式是如果當前請求沒有數據可以返回,則繼續保持當前請求的網絡連接狀態,直到服務端有數據可以返回或者連接超時。長輪詢通過這種方式減少了客戶端與服務端交互的次數,避免了一些無謂的網絡連接。
流:流就是在客戶端的頁面向服務端發出一個長連接的請求。服務器端接到這個請求后作出回應並不斷更新連接狀態以保證客戶端和服務器端的連接不過期。通過這種機制可以將服務器端的信息源源不斷地推向客戶端。
綜上所述,以上這些方案實質上都是用ajax的方法模擬實時效果,實質上並沒有實現真正的實時技術。同時每一次交互都是一次http請求和相應的過程,這就增加了網絡的負載。
Websocket是獨立的基於TCP的協議,其跟http協議的關系僅僅是WebSocket的握手被http服務器當做Upgrade request http包處理。Websocket有自己的握手處理過程。
Websocket鏈接由客戶端發起握手請求,協議內容如下:
1 GET /chat HTTP/1.1 2 Host: server.example.com 3 Upgrade: websocket 4 Connection: Upgrade 5 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 6 Sec-WebSocket-Protocol: chat, superchat 7 Sec-WebSocket-Version: 13 8 Origin: http://example.com
服務端的相應如下:
1 HTTP/1.1 101 Switching Protocols 2 Upgrade: websocket 3 Connection: Upgrade 4 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 5 Sec-WebSocket-Protocol: chat
一旦建立了連接,服務端與客戶端之間就可以以全雙工方式進行通信。
自己在本地起了一個websocket服務端,然后創建了一個websocket鏈接,如下圖所示:
什么是Socket.io?
有很多人經常講Socket.io與websocket搞混,實際上他們並不完全等同。它一個完全由JavaScript實現、基於Node.js、支持WebSocket協議用於實時通信、跨平台的開源框架,它包括了客戶端的JavaScript和服務器端的Node.js。也就是說Socket.io將Websocket和輪詢(Polling)機制以及其它的實時通信方式封裝成了通用的接口,並且在服務端實現了這些實時通信機制。
Socket.io中主要使用了websocket,將輪詢作為其輔助選項,提供的是相同的接口。其與node.js一樣,也是事件驅動的。
參考:
https://github.com/socketio/socket.io
http://blog.csdn.net/ishallwin/article/details/10299815
http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/index.html