WebSocket通訊協定實現的是基於瀏覽器的原生socket,在用戶端用JS即可輕鬆完成。WebSocket的最大功效就是即時性,可以不用重新整理就可以接收資料,這點和Ajax很像,但是又不同於Ajax,Ajax需要發送請求,而WebSocket不用發請求就可以接受伺服器端的資料。下面介紹一下WebSocket協議:
WebSocket的協議是很簡單的,這裡我把它分成用戶端和服務端來講。在用戶端,new WebSocket即可執行個體化一個新的WebSocket對象,但其參數略微有一點不一樣,參數格式是這樣的ws://yourdomain:port/path ,
eg:ws = new WebSocket( “ws://www.zendstudio.net:9108/chat” );)
WebSocket對象會自動解析這段字串,發送到指定伺服器連接埠,首先執行的是雙方握手(handshake),用戶端發送資料格式類似這樣:
GET /chat HTTP/1.1Upgrade: WebSocketConnection: Upgrade Host: www.zendstudio.net:9108Origin:
http://www.zendstudio.net Cookie:
somenterCookie
這很是有些類似於http的頭資訊,同樣每行都是以”\r\n”結尾的,上面這段格式無需我們去構造,WebSocket對象會自動發送,對用戶端這是透明的。此時服務端應該返回的資訊是:
HTTP/1.1 101 Web Socket Protocol HandshakeUpgrade: WebSocket Connection: UpgradeWebSocket-Origin: http://www.zendstudio.net WebSocket-Location:
ws://www.zendstudio.net:9108/chat
從這裡我們太容易看出來,WebSocket協議的握手部分根本就是個類http的協議,所不同的是http每次都會有這樣子的頭資訊互動,這在某些時候不得不顯得很糟糕。而WebSocket只會執行一次這個過程,之後的傳輸資訊就變得異常簡潔了。
用戶端在握手成功後,會觸發WebSocket對象的onopen事件,告訴用戶端串連已經成功建立了。用戶端的WebSocket對象一共綁定了四個事件:
1、onopen:串連建立時觸發;
2、onmessage:收到服務端訊息時觸發;
3、onerror:串連出錯時觸發;
4、onclose:串連關閉時觸發;
有了這4個事件,我們就可以很容易很輕鬆的駕馭WebSocket,並且需要說明的是WebSocket支援位元據的傳輸,因此,它遠不止聊天室應用這麼簡單。
服務端呢?服務端也是非常簡單的,但是仍然需要注意的問題是,作為伺服器,安全和效能是不可忽略的,除此之外,只管往socket裡面寫資料就可以了,WebSocket的通訊資料全部是以”\x00″開頭以”\xFF”結尾的,無論是服務端發出的資料還是用戶端發送的資料都遵從這個格式,唯一不同的是用戶端的WebSocket對象能夠自動將頭尾去除,獲得主體資料,這就省卻了我們在用戶端處理未經處理資料的必要,真是個體貼周到的對象啊!順便說一句,WebSocket通訊資料的編碼總是UTF-8格式的。好了,WebSocket協議就是這麼簡單。到這裡,寫一個服務端應該不是什麼困難的事情了吧?這僅僅需要一點點socket編程知識,任何語言都可以輕鬆實現。