WebSocket

WebSocket 是什麼?

WebSocket 協議在2008年誕生,2011年成爲國際標準。全部瀏覽器都已經支持了。html

WebSocket 是 HTML5 開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議。html5

WebSocket協議是基於TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通訊——容許服務器主動發送信息給客戶端。web

它的最大特色就是,服務器能夠主動向客戶端推送信息,客戶端也能夠主動向服務器發送信息,是真正的雙向平等對話,屬於服務器推送技術的一種。後端

其餘特色包括:瀏覽器

(1)創建在 TCP 協議之上,服務器端的實現比較容易。服務器

(2)與 HTTP 協議有着良好的兼容性。默認端口也是80和443,而且握手階段採用 HTTP 協議,所以握手時不容易屏蔽,能經過各類 HTTP 代理服務器。websocket

(3)數據格式比較輕量,性能開銷小,通訊高效。網絡

(4)能夠發送文本,也能夠發送二進制數據。架構

(5)沒有同源限制,客戶端能夠與任意服務器通訊。異步

(6)協議標識符是ws(若是加密,則爲wss),服務器網址就是 URL。

爲何須要 WebSocket ?

瞭解計算機網絡協議的人,應該都知道:HTTP 協議是一種無狀態的、無鏈接的、單向的應用層協議。它採用了請求/響應模型。通訊請求只能由客戶端發起,服務端對請求作出應答處理。

這種通訊模型有一個弊端:HTTP 協議沒法實現服務器主動向客戶端發起消息。

這種單向請求的特色,註定了若是服務器有連續的狀態變化,客戶端要獲知就很是麻煩。大多數 Web 應用程序將經過頻繁的異步JavaScript和XML(AJAX)請求實現長輪詢。輪詢的效率低,很是浪費資源(由於必須不停鏈接,或者 HTTP 鏈接始終打開)。

HTTP 和 WebSocket 有什麼區別和關係?

WebSocket是HTML5中的協議,支持持久鏈接;而Http協議不支持持久鏈接。

首先HTMl5指的是一系列新的API,或者說新規範,新技術。WebSocket是HTML5中新協議、新API.跟HTTP協議基本沒有關係。

1、Socket簡介

Socket又稱"套接字",應用程序一般經過"套接字"向網絡發出請求或者應答網絡請求。Socket的英文原義是「孔」或「插座」,做爲UNIX的進程通訊機制。Socket能夠實現應用程序間網絡通訊。

Socket可使用TCP/IP協議或UDP協議。

TCP/IP協議

TCP/IP協議是目前應用最爲普遍的協議,是構成Internet國際互聯網協議的最爲基礎的協議,由TCP和IP協議組成:

TCP協議:面向鏈接的、可靠的、基於字節流的傳輸層通訊協議,負責數據的可靠性傳輸的問題。

IP協議:用於報文交換網絡的一種面向數據的協議,主要負責給每臺網絡設備一個網絡地址,保證數據傳輸到正確的目的地。

UDP協議

UDP特色:無鏈接、不可靠、基於報文的傳輸層協議,優勢是發送後不用管,速度比TCP快。

2、WebSocket簡介與消息推送

B/S架構的系統多使用HTTP協議,HTTP協議的特色:

一、無狀態協議

二、用於經過 Internet 發送請求消息和響應消息

三、使用端口接收和發送消息,默認爲80端口,底層通訊仍是使用Socket完成。

 

實現Web端即時通信的方法,行爲方式上兩種通用方法:客戶端拉取或服務器;實現即時通信主要有四種方式,它們大致能夠分爲兩類,一種是在HTTP基礎上實現的,包括短輪詢、comet和SSE;另外一種不是在HTTP基礎上實現是,即WebSocket。

輪詢(polling)

基本思路就是瀏覽器每隔一段時間經過 setInterval 定時向瀏覽器發送http請求,服務器端在收到請求後,不管是否有數據更新,都直接進行響應。

優勢:比較簡單,易於理解,後端程序編寫比較容易。

缺點:請求中有大半是無用,浪費帶寬和服務器資源。

實例:適於小型應用。

長輪詢(long polling)(comet)

當服務器收到客戶端發來的Ajax請求後,服務器端不會直接進行響應,而是先將這個請求掛起,而後判斷服務器端數據是否有更新。一般的作法是,在服務器的程序中加入一個死循環,在循環中監測數據的變更。

優勢:長輪詢和短輪詢比起來,明顯減小了不少沒必要要的http請求次數,相比之下節約了資源。

缺點:鏈接掛起也會致使資源的浪費,返回數據順序無保證,難於管理維護。

實例:WebQQ、Hi網頁版、Facebook IM。

長鏈接(SSE)

Server-Sent Events(服務器發送事件,簡稱SSE),SSE 是單向通道,只能服務器向客戶端發送消息,若是客戶端須要向服務器發送消息,則須要一個新的 HTTP 請求。

在實現上,客戶端瀏覽器中增長EventSource對象,使其能經過事件的方式接收到服務器推送的消息,在服務端,使用長鏈接的事件流協議,即請求響應時增長新數據流數據格式。SSE最大的特色就是不須要客戶端發送請求,能夠實現只要服務器端數據有更新,就能夠立刻發送到客戶端。

很是適應於後端數據更新頻繁且對實時性要求較高而又不須要客戶端向服務端通訊的場景下。

優勢:消息即時到達,不發無用請求;管理起來也相對便。

缺點:服務器維護一個長鏈接會增長開銷。

實例:Gmail聊天

Websocket

WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通信的網絡技術。依靠這種技術能夠實現客戶端和服務器端的長鏈接,雙向實時通訊。

特色:事件驅動、異步、使用ws或者wss協議的客戶端socket,可以實現真正意義上的推送功能

缺點:少部分瀏覽器不支持,瀏覽器支持的程度與方式有區別。

從兼容性角度考慮,短輪詢>長輪詢>長鏈接SSE>WebSocket;

從性能方面考慮,WebSocket>長鏈接SSE>長輪詢>短輪詢。

3、WebSocket客戶端

websocket容許經過JavaScript創建與遠程服務器的鏈接,從而實現客戶端與服務器間雙向的通訊。

在websocket中有兩個方法

一、send() 向遠程服務器發送數據

二、close() 關閉該websocket連接

websocket同時還定義了幾個監聽函數

一、onopen 當網絡鏈接創建時觸發該事件

二、onerror 當網絡發生錯誤時觸發該事件

三、onclose 當websocket被關閉時觸發該事件

四、onmessage 當websocket接收到服務器發來的消息的時觸發的事件,也是通訊中最重要的一個監聽事件。msg.data

websocket還定義了一個readyState屬性,這個屬性能夠返回websocket所處的狀態

一、CONNECTING(0) websocket正嘗試與服務器創建鏈接

二、OPEN(1) websocket與服務器已經創建鏈接

三、CLOSING(2) websocket正在關閉與服務器的鏈接

四、CLOSED(3) websocket已經關閉了與服務器的鏈接

websocket的url開頭是ws,若是須要ssl加密可使用wss,當咱們調用websocket的構造方法構建一個websocket對象(new WebSocket(url))的以後,就能夠進行即時通訊了。

 

更多分享請訪問博客 海馬搜索 www.hmsou.com 

 

參考文章:

一、http://www.runoob.com/html/html5-websocket.html

二、http://www.ruanyifeng.com/blog/2017/05/websocket.html

三、http://www.javashuo.com/article/p-nmcskqka-be.html

相關文章
相關標籤/搜索