流式传输中 SSE 与 WebSocket 的区别

流式传输中 SSE 与 WebSocket 的区别

核心区别总结

​特性 ​SSE ​WebSocket
​传输方向 单向(服务器 → 客户端) 双向(客户端 ↔ 服务器)
​协议基础 基于 HTTP(长连接) 基于 TCP(独立协议 ws:///wss://)
​数据格式 仅文本(UTF-8) 支持文本和二进制数据
​延迟 较高(依赖 HTTP 机制) 极低(全双工通信)
​适用场景 服务器主动推送的流式数据 双向交互的实时流式传输

1. 流式传输中的角色

  • ​SSE

    • ​定位:专为单向服务器推送设计。
    • ​典型场景:
      • 实时日志流(服务器监控)。
      • 金融市场行情(股票价格)。
      • 传感器数据推送(温度、GPS)。
  • ​WebSocket

    • ​定位:支持双向实时通信。
    • ​典型场景:
      • 实时音视频流(结合 WebRTC)。
      • 多人协作应用(文档协同编辑)。
      • 在线游戏(玩家状态同步)。

2. 技术实现差异

​维度 ​SSE ​WebSocket
​协议机制 基于 HTTP 长连接,使用 text/event-stream 格式。 基于 TCP,需通过 HTTP 协议升级握手。
​数据格式 仅文本(JSON/CSV),二进制需编码(Base64)。 支持文本和二进制(如音视频帧)。
​连接管理 自动重连,标头开销低。 需手动处理心跳检测和重连。

3. 性能与限制

​维度 ​SSE ​WebSocket
​延迟 较高(HTTP 缓冲影响)。 极低(直接 TCP 通道)。
​带宽效率 低(文本无压缩)。 高(支持二进制压缩)。
​兼容性 不支持 IE/旧版 Edge。 广泛支持(现代浏览器)。
​开发复杂度 低(无需处理协议细节)。 高(需管理连接状态)。

4. 选择建议

  • ​使用 SSE 的场景:

    • 单向文本流(如实时通知)。
    • 快速实现(代码示例):
      1
      2
      3
      4
      5
      6
      7
      // Node.js + Express
      app.get("/stream", (req, res) => {
      res.setHeader("Content-Type", "text/event-stream");
      setInterval(() => {
      res.write(`data: ${JSON.stringify({ value: Math.random() })}\n\n`);
      }, 1000);
      });
  • ​使用 WebSocket 的场景:

    • 双向交互或二进制流(如音视频通话)。

    • 代码示例(二进制传输):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      // 客户端发送二进制数据
      const buffer = new ArrayBuffer(1024);
      socket.send(buffer);

      // 服务端接收(Node.js + ws库)
      ws.on("message", (data) => {
      if (data instanceof Buffer) {
      // 处理二进制数据
      }
      });

5. 混合使用场景

  • ​SSE + HTTP API:

    • 用 SSE 推送数据流,HTTP 处理客户端操作(如股票行情系统)。
  • ​WebSocket 独立通道:

    • 全双工流式传输(如视频会议信令)。

总结

  • ​SSE:轻量、单向,适合服务器推送文本流。
  • ​WebSocket:双向、低延迟,适合交互性场景。