什麼是Websocket?html
Websocket是一個獨立於http的實時通訊協議,最初是在HTML5中被引用進來的,在HTML5規範中做爲瀏覽器與服務器的核心通訊技術被嵌入到瀏覽器中。WebSocket的出現使得瀏覽器提供對Socket的支持成爲可能,從而在瀏覽器和服務器之間提供了一個基於TCP鏈接的雙向通道。node
在websocket誕生以前,服務端想要向客戶端推送數據只能經過客戶端向服務端主動發送請求才能得到。在構建實時Web應用時,最經常使用的就是輪詢 (Polling)和Comet技術,而Comet技術其實是輪詢技術的改進,又可細分爲兩種實現方式,一種是長輪詢機制,一種稱爲流技術。git
輪詢:這是最先的一種實現實時 Web 應用的方案。客戶端以必定的時間間隔向服務端發出請求,以頻繁請求的方式來保持客戶端和服務器端的同步。github
長輪詢:長輪詢則是針對普通輪詢的這種缺陷的一種改進方案,其具體實現方式是若是當前請求沒有數據能夠返回,則繼續保持當前請求的網絡鏈接狀態,直到服務端有數據能夠返回或者鏈接超時。長輪詢經過這種方式減小了客戶端與服務端交互的次數,避免了一些無謂的網絡鏈接。web
流:流就是在客戶端的頁面向服務端發出一個長鏈接的請求。服務器端接到這個請求後做出迴應並不斷更新鏈接狀態以保證客戶端和服務器端的鏈接不過時。經過這種機制能夠將服務器端的信息源源不斷地推向客戶端。ajax
綜上所述,以上這些方案實質上都是用ajax的方法模擬實時效果,實質上並無實現真正的實時技術。同時每一次交互都是一次http請求和相應的過程,這就增長了網絡的負載。瀏覽器
Websocket是獨立的基於TCP的協議,其跟http協議的關係僅僅是WebSocket的握手被http服務器當作Upgrade request http包處理。Websocket有本身的握手處理過程。服務器
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