当前位置: 首页 > news >正文

基于 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 或企业内网浏览器情况

相关文章:

  • AI语音助手的Python实现
  • 【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
  • SE(Secure Element)加密芯片与MCU协同工作的典型流程
  • R语言速释制剂QBD解决方案之三
  • vue3 报错Missing semicolon
  • 【C++】std::bind和std::placeholders
  • 盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
  • 【Java】Ajax 技术详解
  • 基于当前项目通过npm包形式暴露公共组件
  • 检查项目中的依赖是否有更新——npm outdated
  • 基于SpringBoot实现的汽车资讯网站设计与实现【源码+文档】
  • 【ubutnu 24.04 】 nomachine 安装
  • 第21节 Node.js 多进程
  • 安宝特案例丨又一落地,Vuzix AR眼镜助力亚马逊英国仓库智能化升级!
  • rm视觉学习1-自瞄部分
  • Latex vscode安装、配置与使用-Windows
  • Spring是如何解决Bean的循环依赖:三级缓存机制
  • 比较数据迁移后MySQL数据库和达梦数据库中的表
  • Elasticsearch的索引
  • VMware启动不支持虚拟化的解决方案!
  • 怎样增加网站流量/深圳推广优化公司
  • 做网站维护学什么编程语言/小视频关键词汇总
  • 珠宝店网站项目网页设计/360指数查询
  • 委托建设网站的注意事项/腾讯云建站
  • 宝安做棋牌网站建设哪家服务好/太原seo排名收费
  • 模板网站怎么建设优化/seo是什么意思网络用语