引入
普通 HTTP 通常由客户端发起请求,服务器返回响应。实时聊天、在线协作和行情推送需要服务器主动把新消息发送给客户端,如果不断轮询,不仅增加请求数量,也会引入延迟,因此需要长连接通信机制。
正文
定义
WebSocket 是一种在客户端与服务器之间建立持久连接,并支持双方主动发送消息的通信协议。连接建立后,通信不再局限于“一问一答”的 HTTP 请求模型。
建立连接
WebSocket 通常先通过 HTTP Upgrade 请求发起握手。服务器同意后返回 101 Switching Protocols,连接从 HTTP 升级为 WebSocket;之后双方通过帧持续交换数据。
适用场景
| 场景 | 为什么适合 WebSocket | 需要考虑的问题 |
|---|---|---|
| 在线聊天 | 消息可以实时双向到达 | 重连、离线消息、顺序 |
| 协作编辑 | 服务端可广播变更 | 冲突处理、权限校验 |
| 实时状态 | 减少轮询延迟 | 心跳、连接数量、背压 |
| 实时行情 | 服务器主动推送 | 数据频率和客户端消费能力 |
前端使用时的边界
- 连接断开后需要设计重连策略,不能无限快速重试。
- 应通过心跳或协议机制发现失效连接。
- 服务端仍需验证每条消息的身份和权限,不能因为连接已建立就默认可信。
- 大量连接会增加服务端连接管理和扩展成本。
- 如果只是偶尔获取数据,普通 HTTP、轮询或 SSE 可能更简单。
引出
选择 WebSocket 前,先确认需求是否真的需要双向实时通信。对于只有服务器向客户端推送的场景,可以继续比较 SSE;对于一次性资源获取,则优先使用普通 HTTP。