SSE(Server-Sent Events)是一種用於實現服務器主動向客戶端推送數據的技術,也稱爲“事件流”(Event Stream)。它基於 HTTP 協議,利用了其長連接特性,在客戶端與服務器之間建立一條持久化連接,並通過這條連接實現服務器向客戶端的實時數據推送,但客戶端不能通過SSE向服務端發送數據。
技術原理和實現
SSE 基於 HTTP 協議,利用了其長連接特性,通過瀏覽器向服務器發送一個 HTTP 請求,建立一條持久化的連接。
SSE 可以傳輸文本和二進制格式的數據,但只支持單向數據流,即只能由服務器向客戶端推送數據。
SSE 的連接狀態僅有三種:已連接、連接中、已斷開。連接狀態是由瀏覽器自動維護的,客戶端無法手動關閉或重新打開連接。
SSE 的實現比較簡單,都是基於 HTTP 協議的,與普通的 Web 應用沒有太大差異,因此風險相對較低。
SSE 是標準的 Web API,可以在大部分現代瀏覽器和移動設備上使用。
-
客戶端向服務器發送一個GET請求,帶有指定的header,表示可以接收事件流類型,並禁用任何的事件緩存。
-
服務器返回一個響應,帶有指定的header,表示事件的媒體類型和編碼,以及使用分塊傳輸編碼(chunked)來流式傳輸動態生成的內容。
-
服務器在有數據更新時,向客戶端發送一個或多個名稱:值字段組成的事件,由單個換行符分隔。事件之間由兩個換行符分隔。服務器可以發送事件數據、事件類型、事件ID和重試時間等字段。
-
客戶端使用EventSource接口來創建一個對象,打開連接,並訂閱onopen、onmessage和onerror等事件處理程序來處理連接狀態和接收消息。
-
客戶端可以使用GET查詢參數來傳遞數據給服務器,也可以使用close方法來關閉連接。
適用場景
-
數據更新頻繁:服務器需要不斷地將最新的數據推送給客戶端,保持數據的實時性和準確性。
-
低延遲:服務器需要儘快地將數據推送給客戶端,避免數據的延遲和過期。
-
單向通信:服務器只需要向客戶端推送數據,而不需要接收客戶端的數據。
如:實時監控、消息推送等。