15-18.【HTTP】长轮询、WebSocket 与 SSE(Server-Sent Events)区别?

2 阅读3分钟

1️⃣ 长轮询(Long Polling)

工作原理

  • 客户端向服务器发送 HTTP 请求。
  • 如果服务器没有新数据,保持请求不立即响应,等待数据可用或超时。
  • 服务器返回数据后,客户端立即发起新的请求,形成循环。

特点

  • 基于 HTTP,不需要额外协议。
  • 模拟实时性,延迟低于普通轮询,但仍存在重复 HTTP 请求开销。
  • 连接是短连接,服务器需要保存请求状态。

优点

  • 兼容性好,所有浏览器和 HTTP 客户端支持。

缺点

  • 请求/响应开销大,服务器压力较高。
  • 延迟比真正的推送略高。

iOS 实践

  • 可以用 URLSession 实现,处理循环请求和超时。
  • 适合低频实时更新,例如消息通知、状态刷新。

2️⃣ WebSocket

工作原理

  • 客户端发起 HTTP/HTTPS 握手,升级为 WebSocket 协议。
  • 握手成功后,客户端与服务器保持全双工长连接
  • 双方可以随时发送消息,无需再建立 HTTP 请求。

特点

  • 全双工通信:客户端和服务器都可以主动发送消息。
  • 长连接:减少握手开销。
  • 低延迟:数据直接通过 TCP 发送,无需频繁建立连接。

优点

  • 高实时性,适合聊天室、游戏、股票行情推送。
  • 节省带宽,避免重复 HTTP Header。

缺点

  • 需要 WebSocket 支持的服务器。
  • 长连接可能增加服务器资源占用。

iOS 实践

  • 可以用 URLSessionWebSocketTask 或第三方库(如 Starscream)实现。
  • 支持自动重连、ping/pong 保活。

3️⃣ SSE(Server-Sent Events,服务端推送)

工作原理

  • 客户端发起 HTTP 请求
  • 服务器保持连接,持续发送文本数据流(Event Stream)。
  • 连接是单向的,只有服务器可以推送数据到客户端。

特点

  • 单向推送:服务器 → 客户端。
  • 基于 HTTP,浏览器和 iOS 均可直接使用。
  • 支持自动重连和事件 ID 断点续传。

优点

  • 简单,使用标准 HTTP 协议即可。
  • 适合实时更新数据,例如股票行情、通知、日志流。

缺点

  • 只能单向,客户端无法通过 SSE 发送消息。
  • 连接不适合高频双向通信。

iOS 实践

  • 可使用 URLSessionDataTask 持续接收数据流。
  • 可以解析 SSE 格式的事件行(event: / data:)。

4️⃣ 核心对比表

特性 / 协议长轮询 (Long Polling)WebSocketSSE (Server-Sent Events)
通信方向客户端 → 服务器请求 → 服务器返回双向(全双工)单向(服务器 → 客户端)
连接类型短连接/循环请求长连接长连接
协议HTTP/HTTPSWebSocket (TCP 协议)HTTP/HTTPS
实时性中等(依赖循环请求频率)高(实时推送)高(实时推送,单向)
服务器压力高(频繁请求)中(长连接,但少握手开销)低~中(单向长连接)
适用场景低频实时更新,兼容性要求高高频双向通信,聊天室、游戏单向实时更新,如通知、日志流
iOS 支持✅ URLSession✅ URLSessionWebSocketTask✅ URLSessionDataTask

总结

  • 长轮询:HTTP 模拟实时,适合低频场景。
  • WebSocket:双向实时通信,高频场景必备。
  • SSE:单向服务器推送,轻量实时更新场景。