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) | WebSocket | SSE (Server-Sent Events) |
|---|---|---|---|
| 通信方向 | 客户端 → 服务器请求 → 服务器返回 | 双向(全双工) | 单向(服务器 → 客户端) |
| 连接类型 | 短连接/循环请求 | 长连接 | 长连接 |
| 协议 | HTTP/HTTPS | WebSocket (TCP 协议) | HTTP/HTTPS |
| 实时性 | 中等(依赖循环请求频率) | 高(实时推送) | 高(实时推送,单向) |
| 服务器压力 | 高(频繁请求) | 中(长连接,但少握手开销) | 低~中(单向长连接) |
| 适用场景 | 低频实时更新,兼容性要求高 | 高频双向通信,聊天室、游戏 | 单向实时更新,如通知、日志流 |
| iOS 支持 | ✅ URLSession | ✅ URLSessionWebSocketTask | ✅ URLSessionDataTask |
✅ 总结:
- 长轮询:HTTP 模拟实时,适合低频场景。
- WebSocket:双向实时通信,高频场景必备。
- SSE:单向服务器推送,轻量实时更新场景。