共計 2840 個字符,預計需要花費 8 分鐘才能閱讀完成。
這篇文章主要介紹“長輪詢、WebSocket、服務器發送事件有什么區別”的相關知識,丸趣 TV 小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“長輪詢、WebSocket、服務器發送事件有什么區別”文章能幫助大家解決問題。
長輪詢、WebSocket 和服務器發送事件有什么區別
長輪詢,WebSocket 和服務器發送事件是客戶端和服務器 (如 Web 瀏覽器和 Web 服務器) 之間流行的通信協議。首先,讓我們了解標準 HTTP Web 請求。以下是常規 HTTP 請求的一系列事件:
客戶端打開連接并從服務器請求數據。
服務器計算響應。
服務器根據打開的請求將響應發送回客戶端。
Ajax 輪詢協議
輪詢是絕大多數 AJAX 應用程序使用的一種標準技術。基本思想是客戶端反復輪詢 (或請求) 服務器以獲取數據。客戶端發出請求,并等待服務器響應數據。如果沒有可用數據,則返回空響應。
客戶端使用常規 HTTP 打開連接并從服務器請求數據。
所請求的網頁以固定間隔將請求發送到服務器(例如 0.5 秒)。
服務器計算響應并將其發送回,就像常規 HTTP 流量一樣。
客戶端定期重復上述三個步驟,以從服務器獲取更新。
輪詢的問題在于客戶端必須不斷向服務器詢問任何新數據。會照成許多空響應,從而造成 HTTP 開銷。
HTTP 長輪詢協議
這是傳統輪詢技術的一種變體,該技術允許服務器在數據可用時將信息推送到客戶端。使用 Long-Polling,客戶端可以像正常輪詢一樣從服務器請求信息,但是服務器可能不會立即響應。這就是為什么這種技術有時被稱為“掛起請求”的原因。
如果服務器沒有可供客戶端使用的任何數據,則服務器將保留請求并等待直到某些數據可用為止,而不是發送空響應。
一旦數據可用,完整的響應將發送到客戶端。然后,客戶端立即從服務器重新請求信息,以便服務器幾乎始終具有可用的等待請求,服務器可以使用該請求來響應事件。
使用 HTTP Long-Polling 的應用程序的基本生命周期如下:
客戶端使用常規 HTTP 發出初始請求,然后等待響應。
服務器延遲其響應,直到有可用的更新或發生超時為止。
當有可用更新時,服務器會將完整的響應發送到客戶端。
客戶端通常會在收到響應后立即發送新的長輪詢請求,或者在允許的等待時間的暫停后發送新的長輪詢請求。
每個長輪詢請求都有一個超時。由于超時而關閉連接后,客戶端必須定期重新連接。
WebSockets 協議
WebSocket 提供全雙工單個 TCP 連接上的通信通道。它提供了客戶端和服務器之間的持久連接,雙方都可以使用該連接隨時開始發送數據。客戶端通過稱為 WebSocket 握手的過程建立 WebSocket 連接。如果該過程成功,則服務器和客戶端可以隨時在兩個方向上交換數據。WebSocket 協議使客戶端和服務器之間的通信具有較低的開銷,從而促進了與服務器之間的實時數據傳輸。通過提供一種標準化的方法,使服務器無需客戶端詢問即可將內容發送到瀏覽器,并允許消息在保持連接打開的情況下來回傳遞。
服務器發送事件協議(SSEs)
在 SSEs 下,客戶端與服務器建立持久的長期連接。服務器使用此連接將數據發送到客戶端。如果客戶端要向服務器發送數據,則需要使用另一種技術 / 協議。
客戶端使用常規 HTTP 向服務器請求數據。
所請求的網頁將打開與服務器的連接。
只要有新信息可用,服務器就會將數據發送到客戶端。
當我們需要從服務器到客戶端的實時流量,或者服務器正在循環生成數據并將向客戶端發送多個事件時,SSEs 最好。
總結
常見的前后端消息通信協議如下:
傳統的輪詢協議
Http 長輪詢協議
WebSockets 協議
SSEs 協議
SSEs 協議剖析
其中除了 SSEs 協議,其他方法大家都很熟悉了,再來看看 SSEs 到底是個啥?
SSE,即 Server-Sent Events,又叫 EventSource,是一種已被寫入 HTML 5 標準的服務端事件推送技術,它允許客戶端和服務端之間建立一個單向通道,以讓服務端向客戶端單方向持續推送事件消息,SSE 適用于不需要從客戶端發送數據,但要通過某些服務器操作進行更新的場景,例如股票行情、共享設施更新、好友狀態更新等。
上面已經簡介過其大致流程了,簡單說,所謂 SSE,就是瀏覽器向服務器發送一個 HTTP 請求,然后服務器不斷單向地向瀏覽器推送“信息”(message)。這種信息在格式上很簡單,就是“信息”加上前綴“data: ”,然后以“\n\n”結尾。
SSE 與 WebSocket 有相似功能,都是用來建立瀏覽器與服務器之間的通信渠道。
兩者的對比如下:
SSEWebsockethttp 協議,可以直接運行于現有的代理服務器和認證技術獨立的 websocket 協議,需要服務器端支持 SSE 是單向通道,只能服務器向瀏覽器端發送。全雙工通道,可以雙向通信,功能更強輕量級,實現簡單實現相對復雜默認支持斷線重連需要自己實現心跳斷線重連文本傳輸二進制傳輸支持自定義發送的消息類型無
客戶端 DEMO
script type= text/javascript if (!!window.EventSource) { var source = new EventSource( push // 打開連接 source.addEventListener( open , function (evt) { // console.info( 連接已經打開了 }, false); // 接收消息 source.addEventListener(message , function (evt) { console.info(evt.data); }); // 錯誤消息, 及關閉通知 source.addEventListener(error , function (evt) { // console.info(evt); }, false); } else { alert( 瀏覽器不支持 SSE) } /script
服務端 DEMO
首先向客戶端聲明接下來發送的是事件流 text/event-stream 類型的數據,然后就可以向客戶端多次發送消息。事件流是一個簡單的文本流,僅支持 UTF-8 格式的編碼。每條消息以一個空行作為分隔符。
@RestController public class SSEsController { // 向瀏覽器發送數據 @RequestMapping(value = /push , produces = text/event-stream) public String push() throws InterruptedException { String msg = ...; // 固定格式 return data: + msg + \n\n } }
關于“長輪詢、WebSocket、服務器發送事件有什么區別”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注丸趣 TV 行業資訊頻道,丸趣 TV 小編每天都會為大家更新不同的知識點。