logo
Communication

Long polling / WebSockets / SSE

实时通信方式

早期 web 应用基本是 client-server 模型,client 只能主动请求,server 无法主动 push 数据。以下是常见的实时通信方案。

long-polling-vs-websockets

Trade-off 快览

  • Long Polling:实现简单,但连接频繁重建、资源消耗高
  • WebSockets:全双工长连接,实时性强,但需要连接管理与扩展策略
  • SSE:单向推送更轻量,适合通知流

Long polling

HTTP Long polling 让 server 在有消息时尽快返回,从而“模拟” server push。server 收到请求后不立即关闭连接,而是等到有新消息或 timeout 才响应。

long-polling

Client 收到响应后会立刻发起下一次请求,形成持续的 pending connection。

Working

  1. Client 发起请求并等待响应。
  2. Server 收到请求后延迟响应,直到有更新。
  3. 有更新时返回响应。
  4. Client 收到后立即发起下一次请求。

Advantages

  • 实现简单,适合小规模项目
  • 几乎所有环境都支持

Disadvantages

  • 不够 scalable
  • 每次都新建连接,server 压力大
  • 多请求情况下消息顺序可能混乱
  • 需要等待新请求导致 latency 增加

WebSockets

WebSocket 在单一 TCP 连接上提供 full-duplex 通信,client 与 server 任意一方都可以随时发送数据。连接通过 WebSocket handshake 建立,成功后可双向实时通信。

websockets

WebSocket 允许 server 主动发送内容,并保持连接持续开放。

Working

  1. Client 发起 WebSocket handshake 请求。
  2. 请求包含 HTTP Upgrade header,切换协议到 ws://
  3. Server 返回响应,确认 handshake。
  4. 连接建立后,双方可双向发送数据。
  5. 连接由 client 或 server 决定关闭。

Advantages

  • Full-duplex async messaging
  • 更好的 origin-based security
  • 对 client / server 都轻量

Disadvantages

  • 断线后不会自动恢复
  • 老旧浏览器不支持(影响逐渐减少)

Server-Sent Events (SSE)

SSE 是一种长期连接方式,允许 server 主动推送数据给 client。它是单向的:client 发起请求后只能接收数据,不能复用同一连接向 server 发送新请求。

server-sent-events

Working

  1. Client 向 server 发请求。
  2. 连接建立并保持打开。
  3. Server 在有新数据时推送事件。

Advantages

  • 实现简单
  • 大多数浏览器支持
  • 穿透防火墙问题少

Disadvantages

  • 单向限制
  • 连接数上限
  • 不支持二进制数据

相关练习题

Long polling / WebSockets / SSE

暂无相关练习题