老的Websocket介紹

鴨脖發表於2012-07-05

  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程式設計知識,任何語言都可以輕鬆實現。

相關文章