1. 程式人生 > 其它 >Web端即時通訊技術

Web端即時通訊技術

文章轉載於https://cloud.tencent.com/developer/article/1076547

實現Web端即時通訊的方法:實現即時通訊主要有四種方式,它們分別是輪詢、長輪詢(comet)、長連線(SSE)、WebSocket。它們大體可以分為兩類,一種是在HTTP基礎上實現的,包括短輪詢、comet和SSE;另一種不是在HTTP基礎上實現是,即WebSocket。下面分別介紹一下這四種輪詢方式,以及它們各自的優缺點。

①輪詢

  短輪詢的基本思路就是瀏覽器每隔一段時間向瀏覽器傳送http請求,伺服器端在收到請求後,不論是否有資料更新,都直接進行響應。這種方式實現的即時通訊,本質上還是瀏覽器傳送請求,伺服器接受請求的一個過程,通過讓客戶端不斷的進行請求,使得客戶端能夠模擬實時地收到伺服器端的資料的變化。

  這種方式的優點是比較簡單,易於理解,實現起來也沒有什麼技術難點。缺點是顯而易見的,這種方式由於需要不斷的建立http連線,嚴重浪費了伺服器端和客戶端的資源。尤其是在客戶端,距離來說,如果有數量級想對比較大的人同時位於基於短輪詢的應用中,那麼每一個使用者的客戶端都會瘋狂的向伺服器端傳送http請求,而且不會間斷。人數越多,伺服器端壓力越大,這是很不合理的。

  因此短輪詢不適用於那些同時線上使用者數量比較大,並且很注重效能的Web應用。

var xhr = new XMLHttpRequest();
    setInterval(function(){
        xhr.open('GET','/user');
        xhr.onreadystatechange = function(){

        };
        xhr.send();
    },1000)

  

②長輪詢(comet)

ajax實現:

  當伺服器收到客戶端發來的請求後,伺服器端不會直接進行響應,而是先將這個請求掛起,然後判斷伺服器端資料是否有更新。如果有更新,則進行響應,如果一直沒有資料,則到達一定的時間限制(伺服器端設定)才返回。。 客戶端JavaScript響應處理函式會在處理完伺服器返回的資訊後,再次發出請求,重新建立連線。

  長輪詢和短輪詢比起來,明顯減少了很多不必要的http請求次數,相比之下節約了資源。長輪詢的缺點在於,連線掛起也會導致資源的浪費。

   function ajax(){
        var xhr = new XMLHttpRequest();
        xhr.open('GET','/user');
        xhr.onreadystatechange = function(){
              ajax();
        };
        xhr.send();
    }

  

輪詢與長輪詢都是基於HTTP的,兩者本身存在著缺陷:輪詢需要更快的處理速度;長輪詢則更要求處理併發的能力;兩者都是“被動型伺服器”的體現:伺服器不會主動推送資訊,而是在客戶端傳送ajax請求後進行返回的響應。而理想的模型是"在伺服器端資料有了變化後,可以主動推送給客戶端",這種"主動型"伺服器是解決這類問題的很好的方案。Web Sockets就是這樣的方案。

③長連線(SSE)

  SSE是HTML5新增的功能,全稱為Server-Sent Events。它可以允許服務推送資料到客戶端。SSE在本質上就與之前的長輪詢、短輪詢不同,雖然都是基於http協議的,但是輪詢需要客戶端先發送請求。而SSE最大的特點就是不需要客戶端傳送請求,可以實現只要伺服器端資料有更新,就可以馬上傳送到客戶端。

  SSE的優勢很明顯,它不需要建立或保持大量的客戶端發往伺服器端的請求,節約了很多資源,提升應用效能。並且後面會介紹道,SSE的實現非常簡單,並且不需要依賴其他外掛。

④WebSocket

  WebSocket是Html5定義的一個新協議,與傳統的http協議不同,該協議可以實現伺服器與客戶端之間全雙工通訊。簡單來說,首先需要在客戶端和伺服器端建立起一個連線,這部分需要http。連線一旦建立,客戶端和伺服器端就處於平等的地位,可以相互發送資料,不存在請求和響應的區別。

  WebSocket的優點是實現了雙向通訊,缺點是伺服器端的邏輯非常複雜。現在針對不同的後臺語言有不同的外掛可以使用。

四種Web即時通訊技術比較

  從相容性角度考慮,短輪詢>長輪詢>長連線SSE>WebSocket;

  從效能方面考慮,WebSocket>長連線SSE>長輪詢>短輪詢。