基于 HTTP 的單向流式通信協議SSE詳解

SSE(Server-Sent Events)詳解

🧠 什么是 SSE?

SSE(Server-Sent Events) 是 HTML5 標準中定義的一種通信機制,它允許服務器主動將事件推送給客戶端(瀏覽器)。與傳統的 HTTP 請求-響應不同,SSE 是一種基于 HTTP 的單向流式通信協議

📌 核心特性

特性描述
通信方式單向:服務器 → 客戶端
連接類型持久的 HTTP 長連接
數據格式文本(MIME 類型:text/event-stream
自動重連瀏覽器自動支持
底層協議HTTP/1.1,兼容 HTTP 代理、緩存、身份驗證
建立方式瀏覽器端使用 EventSource 對象

🧱 通信流程(架構圖)

瀏覽器(客戶端)
└── 發起 HTTP GET 請求(Accept: text/event-stream)↓
服務器端(保持連接)
└── 每當有事件,推送:data: xxxid: 1event: myEventretry: 3000[連接不斷,服務器持續發送,客戶端持續接收]

🧪 示例詳解

1. 客戶端(JS)

const source = new EventSource('/events');source.onmessage = (event) => {console.log('默認消息:', event.data);
};source.addEventListener('update', (event) => {console.log('收到 update 事件:', event.data);
});source.onerror = (err) => {console.error('連接異常', err);
};

2. 服務器端(Node.js 示例)

app.get('/events', (req, res) => {res.setHeader('Content-Type', 'text/event-stream');res.setHeader('Cache-Control', 'no-cache');res.setHeader('Connection', 'keep-alive');res.write('retry: 5000\n'); // 自動重連時間res.write('event: update\n');res.write(`data: 你好,客戶端\n\n`);const interval = setInterval(() => {res.write(`data: 當前時間 ${new Date().toISOString()}\n\n`);}, 3000);req.on('close', () => {clearInterval(interval);res.end();});
});

🎯 典型應用場景

場景描述
實時通知系統消息推送、任務進度提醒
實時監控面板日志、CPU、內存、API 狀態
數據大屏股票/氣象/新聞流更新
聊天室(只讀方)只需服務器廣播消息
DevTools/日志監聽構建日志實時顯示

📄 SSE 消息格式

event: update
id: 12345
retry: 5000
data: 你好
data: 世界

字段說明

字段說明
data:消息內容,可多行,客戶端拼接為一條
event:事件名稱,配合 JS 的 addEventListener 使用
id:消息 ID,客戶端會自動緩存用于斷線續傳
retry:告訴瀏覽器下次重連時間(ms)

🧰 與 WebSocket 對比

對比項SSEWebSocket
通信方向單向(服務器 → 客戶端)雙向
協議基于 HTTP使用 ws:// 或 wss://(非 HTTP)
使用復雜度簡單(瀏覽器原生支持)需要手動管理消息格式、連接狀態
數據格式純文本(text/event-stream文本或二進制
自動重連瀏覽器原生支持需要自行實現
代理支持很好(HTTP 代理可用)差(很多 HTTP 代理不支持)
應用場景實時通知、日志流聊天、游戲、協同操作等交互頻繁的場景

📡 瀏覽器支持情況

瀏覽器支持情況
Chrome?
Firefox?
Safari?
Edge(Chromium)?
Internet Explorer? 不支持
移動端瀏覽器?(多數現代瀏覽器)

?? 限制與注意事項

  1. 不支持 IE
  2. 只能從服務器推送
  3. 受限于 HTTP 連接數
  4. 不適合傳輸大量二進制數據

🔐 跨域 & 認證

  • 使用 CORS 即可跨域支持:
Access-Control-Allow-Origin: *
Content-Type: text/event-stream
  • URL Token 示例:
new EventSource(`/events?token=abc123`);

📦 框架與工具支持

技術棧支持方式
Node.js原生、Express、NestJS
PythonFlask + flask-sse,Django Channels
JavaSpring WebFlux、Servlet 推送
Go原生 net/http
RustActix、Rocket 支持 SSE
Vue/ReactEventSource 封裝 Hook/Composables
Nginx可代理 SSE,需關閉緩存,配置 proxy_buffering off;

? 總結:SSE 的優勢與應用判斷

  • ? 簡單、輕量級、易于實現和部署(基于 HTTP)
  • ? 適合實時監控、系統通知、數據流更新
  • ? 不適合需要客戶端發消息或二進制傳輸
  • ? 兼容性上需考慮 IE 或企業內網瀏覽器情況

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908980.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【react+antd+vite】優雅的引入svg和阿里巴巴圖標

1.安裝相關包 由于是vite項目,要安裝插件來幫助svg文件引入進來,否則會失敗 npm下載包 npm i vite-plugin-svgr vite.config.ts文件內: import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …

UI框架-通知組件

UI框架-通知組件 介紹 一個基于 Vue 3 的輕量級通知組件庫,提供了豐富的消息通知功能。支持多種通知類型、自定義樣式、進度條顯示等特性。 特性 🎨 支持多種通知類型:信息、成功、警告、錯誤? 支持進度條顯示🔄 支持加載中狀…

WordZero:讓Markdown與Word文檔自由轉換的Golang利器

在日常工作中,我們經常需要在Markdown和Word文檔之間進行轉換。Markdown方便編寫和版本控制,而Word文檔更適合正式的商務環境。作為一名Golang開發者,我開發了WordZero這個庫,專門解決這個痛點。 項目背景 GitHub倉庫&#xff1…

計算機網絡面試匯總(完整版)

基礎 1.說下計算機網絡體系結構 計算機網絡體系結構,一般有三種:OSI 七層模型、TCP/IP 四層模型、五層結構。 簡單說,OSI是一個理論上的網絡通信模型,TCP/IP是實際上的網絡通信模型,五層結構就是為了介紹網絡原理而折…

動端React表格組件:支持合并

前言 在移動端開發中,表格組件是一個常見但復雜的需求。相比PC端,移動端表格面臨著屏幕空間有限、交互方式不同、性能要求更高等挑戰。本文將詳細介紹如何從零開始構建一個功能完整的移動端React表格組件,包含固定列、智能單元格合并、排序等…

廣告系統中后鏈路數據為什么要使用流批一體技術?流批一體技術是什么?

在大規模廣告系統的后鏈路(離線和實時特征計算、模型訓練與上線、效果監控等)中,往往既有對海量歷史數據的批量計算需求(離線特征、離線模型訓練、報表匯總),又有對在線請求的低延遲實時計算需求(實時特征、在線打分、實時監控/告警)。傳統將二者割裂、用 Lambda 架構…

6.10 - 常用 SQL 語句以及知識點

MySQL 技術 SQL 是結構化查詢語言,他是關系型數據庫的通用語言 SQL 可以分為分為以下三個類別 DDL (data definition languages) 語句 數據定義語言,定義了 不同的數據庫、表、索引等數據庫對象的定義。常用的的語句關鍵字包括 **create、drop、alter …

OpenCV CUDA 模塊光流計算------稀疏光流算法類SparsePyrLKOpticalFlow

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 OpenCV CUDA 模塊中實現的稀疏光流算法類,基于 Lucas-Kanade 方法,并支持圖像金字塔結構。適用于特征點跟蹤任務&#xf…

免費工具-微軟Bing Video Creator

目錄 引言 一、揭秘Bing Video Creator 二、輕松上手:三步玩轉Bing Video Creator 2.1 獲取與訪問: 2.2 創作流程: 2.3 提示詞撰寫技巧——釋放AI的想象力: 三、核心特性詳解:靈活滿足多樣化需求 3.1 雙重使用模…

MySQL技術內幕1:內容介紹+MySQL編譯使用介紹

文章目錄 1.整體內容介紹2.下載編譯流程2.1 安裝編譯工具和依賴庫2.2 下載編譯 3.配置MySQL3.1 數據庫初始化3.2 編輯配置文件3.3 啟動停止MySQL3.4 登錄并修改密碼 1.整體內容介紹 MySQL技術系列文章將從MySQL下載編譯,使用到MySQL各組件使用原理源碼分析&#xf…

MySQL 事務詳解

MySQL 事務詳解 一、事務是什么?為什么需要事務? 二、事務的四大特性(ACID)舉例說明:轉賬操作 三、MySQL 中事務的支持四、事務分類:隱式 vs 顯式1. 隱式事務(自動提交)2. 顯式事務&…

深入淺出Asp.Net Core MVC應用開發系列-AspNetCore中的日志記錄

ASP.NET Core 是一個跨平臺的開源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 應用。 ASP.NET Core 中的日志記錄 .NET 通過 ILogger API 支持高性能結構化日志記錄,以幫助監視應用程序行為和診斷問題。 可以通過配置不同的記錄提供程…

利用coze工作流制作一個自動生成PPT的智能體

在Coze平臺中,通過工作流實現PPT自動化生成是一個高效且靈活的解決方案,尤其適合需要快速產出標準化演示文稿的場景。以下是基于Coze工作流制作PPT的核心邏輯與操作建議: 理論流程 一、核心流程設計 需求輸入與解析 用戶輸入:主…

vue3 按鈕級別權限控制

在Vue 3中實現按鈕級別的權限控制,可以通過多種方式實現。這里我將介紹幾種常見的方法: 方法1:使用Vue 3的Composition API 在Vue 3中,你可以使用Composition API來創建一個可復用的邏輯來處理權限控制。 創建權限控制邏輯 首…

spa首屏加載慢怎樣解決

SPA(Single Page Application,單頁應用)首屏加載慢是一個常見問題,主要原因通常是首次加載需要拉取體積較大的 JavaScript 文件、樣式表、初始化數據等。以下是一些常見的 優化策略,可以幫助你 提升首屏加載速度&#…

UE5 音效系統

一.音效管理 音樂一般都是WAV,創建一個背景音樂類SoudClass,一個音效類SoundClass。所有的音樂都分為這兩個類。再創建一個總音樂類,將上述兩個作為它的子類。 接著我們創建一個音樂混合類SoundMix,將上述三個類翻入其中,通過它管理每個音樂…

2.Vue編寫一個app

1.src中重要的組成 1.1main.ts // 引入createApp用于創建應用 import { createApp } from "vue"; // 引用App根組件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要寫三種標簽 <template> <!--html--> </template>…

NTT印地賽車:數字孿生技術重構賽事體驗范式,驅動觀眾參與度革命

引言&#xff1a;數字孿生技術賦能體育賽事&#xff0c;開啟沉浸式觀賽新紀元 在傳統體育賽事觀賽模式遭遇體驗天花板之際&#xff0c;NTT與印地賽車系列賽&#xff08;NTT INDYCAR SERIES&#xff09;的深度合作&#xff0c;通過數字孿生&#xff08;Digital Twin&#xff09…

解構與重構:PLM 系統如何從管理工具進化為創新操作系統?

在智能汽車、工業物聯網等新興領域的沖擊下&#xff0c;傳統產品生命周期管理&#xff08;PLM&#xff09;系統正在經歷前所未有的范式轉換。當某頭部車企因 ECU 軟件與硬件模具版本失配導致 10 萬輛智能電車召回&#xff0c;損失高達 6 億美元時&#xff0c;這場危機不僅暴露了…

【Ubuntu 16.04 (Xenial)??】安裝docker及容器詳細教程

Ubuntu 16.04 安裝docker詳細教程 一、docker安裝1.1 前期準備1.2 使用 Docker 官方安裝腳本安裝&#xff08;推薦&#xff09; 查看ubuntu版本&#xff1a;lsb_release -a 這里我的系統是 ??Ubuntu 16.04 (Xenial)??&#xff0c;在 ??Ubuntu 16.04 (Xenial)?? 上安裝…