type
status
date
slug
summary
tags
category
icon
password
Server-Sent Events(SSE)是一种基于 HTTP 协议的服务器到客户端的单向实时通信技术,允许服务器主动向客户端(如浏览器)推送数据流。以下从核心概念、技术原理、应用场景和局限性等方面全面解析 SSE:
一、核心概念
- 单向通信 SSE 仅支持服务器向客户端推送数据,客户端无法通过同一连接向服务器发送请求。这种单向性使其适用于只需服务端主动推送的场景,如新闻更新、实时数据展示等
- 基于 HTTP 与 WebSocket 不同,SSE 完全基于 HTTP 协议,无需切换协议或端口,兼容现有 HTTP 基础设施(如反向代理、负载均衡)
- 轻量级与自动重连 SSE 提供自动重连机制(通过
retry
字段控制重试间隔),且客户端 API(EventSource
)简单易用,无需额外库支持
二、技术原理
- 连接建立
- 客户端通过
EventSource
发起 HTTP GET 请求,请求头需包含Accept: text/event-stream
。 - 服务器响应头需设置
Content-Type: text/event-stream
和Cache-Control: no-cache
,以标识 SSE 数据流并禁用缓存 。
- 数据格式 服务器发送的数据遵循特定格式:。
event: customEvent
data: 消息内容(可多行)
id: 12345 // 事件唯一标识符(用于断线重连)
retry: 5000 // 重连间隔(毫秒)
\n\n // 两个换行符表示一条消息结束
客户端通过监听特定事件(如
onmessage
或自定义事件 ping
)处理数据- 长连接与心跳机制
- 服务器保持 TCP 连接开放,持续发送数据流。
- 为避免连接超时,服务器可定期发送“心跳消息”(如空注释行
: heartbeat\n\n
)
- 实时通知
- 社交媒体动态、聊天消息、订单状态更新等
- 示例:外卖平台实时推送配送进度
- 数据流推送
- 股票行情、IoT 设备数据、日志监控等持续数据流
- 示例:ChatGPT 逐字生成回答时使用 SSE 边计算边返回 。
- 低复杂度场景
- 需快速实现的轻量级实时功能(如网页版在线考试倒计时)
四、与 WebSocket 的对比
特性 | SSE | WebSocket |
通信方向 | 单向(服务端→客户端) | 双向 |
协议 | HTTP | WebSocket(独立协议) |
自动重连 | 支持 | 需客户端实现 |
数据格式 | 文本(需编码处理二进制数据) | 支持文本和二进制 |
适用场景 | 服务端主导的推送 | 双向交互(如聊天、游戏) |
浏览器兼容性 | 大部分现代浏览器(IE 不支持) | 主流浏览器均支持 |
ㅤ | ㅤ |
五、局限性
- 单向性限制 无法实现客户端向服务器的实时交互,需结合其他技术(如 AJAX)完成双向通信
- 连接数限制 HTTP/1.1 下浏览器对同一域名的 SSE 连接数有限制(通常 6 个),HTTP/2 可通过多路复用缓解此问题。
- 旧浏览器兼容性 IE 和早期 Edge 浏览器不支持 SSE,需降级为轮询或长轮询