天天看點

websocket全雙工通信簡介

本文摘自百度百科和《spring實戰》

簡介

websocket protocol是html5的一種新的協定,它實作了浏覽器和伺服器的全雙工通信(full-duplex),它能夠實作web浏覽器和伺服器之間的異步通信。全雙工通信意味着伺服器可以發送消息給浏覽器,浏覽器也可以發送消息給伺服器;

背景

在浏覽器中通過http僅能實作單向的通信,comet(長連結)可以一定程度上模拟雙向通信,但效率較低,并需要伺服器有較好的支援; flash中的socket和xmlsocket可以實作真正的雙向通信,通過 flex ajax bridge,可以在javascript中使用這兩項功能. 可以預見,如果websocket一旦在浏覽器中得到實作,将會替代上面兩項技術,得到廣泛的使用.面對這種狀況,HTML5定義了WebSocket協定,能更好的節省伺服器資源和帶寬并達到實時通訊。

在JavaEE7中也實作了WebSocket協定。

原理

現很多網站為了實作即時通訊,所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由浏覽器對伺服器發出HTTP request,然後由伺服器傳回最新的資料給用戶端的浏覽器。這種傳統的HTTP request 的模式帶來很明顯的缺點 – 浏覽器需要不斷的向伺服器送出請求,然而HTTP request 的header是非常長的,裡面包含的有用資料可能隻是一個很小的值,這樣會占用很多的帶寬。

在 WebSocket API,浏覽器和伺服器隻需要做一個握手的動作,然後,浏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。在此WebSocket 協定中,為我們實作即時服務帶來了兩大好處: 1. Header 互相溝通的Header是很小的-大概隻有 2 Bytes 2. Server Push 伺服器的推送,伺服器不再被動的接收到浏覽器的request之後才傳回資料,而是在有新資料時就主動推送給浏覽器。

握手協定

在實作websocket連線過程中,需要通過浏覽器發出websocket連線請求,然後伺服器發出回應,這個過程通常稱為“握手” (handshaking)。