HTTP 事件流(SSE)与WebSocket的区别
HTTP 的事件流(如 Server-Sent Events, SSE)和 WebSocket 都是用于实现实时通信的技术,但它们在设计目标、工作方式和适用场景上有显著区别。
以下是两者的详细对比:
1. 通信模式
-
HTTP 事件流(SSE)
- 单向通信:仅支持服务器向客户端推送数据(服务器 → 客户端)。
- 基于 HTTP 协议,客户端通过普通 HTTP 请求建立连接,服务器通过长连接(
text/event-stream)持续发送数据。 - 客户端无法通过同一连接向服务器发送数据(需额外使用 AJAX 等)。
-
WebSocket
- 全双工通信:支持双向实时数据传输(服务器 ↔ 客户端)。
- 基于独立的 WebSocket 协议(
ws://或wss://),通过 HTTP 协议升级握手后建立持久连接。
2. 协议与连接
-
SSE
- 使用标准 HTTP/HTTPS,兼容现有网络基础设施(如代理、防火墙)。
- 客户端通过
EventSourceAPI 监听服务器事件,连接断开时会自动重连。
-
WebSocket
- 自定义协议(基于 TCP),需服务器和客户端显式支持。
- 连接建立后,双方可随时发送数据,无需重复握手。
3. 数据格式
-
SSE
- 数据格式为纯文本(
text/event-stream),每条消息以data:开头,支持多字段(如event:、id:)。 - 适合推送结构化文本(如 JSON)。
- 数据格式为纯文本(
-
WebSocket
- 支持二进制和文本数据,灵活性更高。
- 需自行定义消息格式(如 JSON、Protocol Buffers)。
4. 性能与开销
-
SSE
- HTTP 长连接,每次通信仍携带 HTTP 头(轻微开销)。
- 服务器推送效率高,适合低频或单向数据流(如股票行情、新闻推送)。
-
WebSocket
- 连接建立后无额外头开销,适合高频、低延迟场景(如聊天、游戏)。
- 需维护状态,服务器资源占用略高。
5. 兼容性与支持
-
SSE
- 浏览器支持良好(除 IE/Edge 旧版本),后端需支持
text/event-stream。 - 无法通过 HTTP/2 的 Server Push 实现(SSE 是应用层协议)。
- 浏览器支持良好(除 IE/Edge 旧版本),后端需支持
-
WebSocket
- 所有现代浏览器均支持,但需处理代理/防火墙问题(部分可能拦截 WebSocket 流量)。
6. 典型场景
-
SSE 适用场景
- 实时通知(如社交媒体更新)。
- 监控数据推送(如服务器日志、传感器数据)。
- 只需服务器主动推送的简单应用。
-
WebSocket 适用场景
- 双向交互应用(如在线协作编辑、视频通话)。
- 高频数据交换(如实时游戏、聊天室)。
总结对比表
| 特性 | HTTP 事件流(SSE) | WebSocket |
|---|---|---|
| 通信方向 | 单向(服务器 → 客户端) | 双向(服务器 ↔ 客户端) |
| 协议 | HTTP | WebSocket(独立协议) |
| 数据格式 | 文本(text/event-stream) |
文本或二进制 |
| 连接开销 | 每次请求携带 HTTP 头 | 无额外头(连接建立后) |
| 浏览器支持 | 较好(IE/Edge 旧版不支持) | 全面支持 |
| 适用场景 | 服务器推送、低频数据 | 高频交互、实时双向通信 |
选择建议
- 如果只需服务器推送且对兼容性要求高,选 SSE。
- 如果需要双向通信或高频数据交换,选 WebSocket。
- 两者也可结合使用(例如用 SSE 推送通知,用 WebSocket 处理用户交互)。

浙公网安备 33010602011771号