6月1日 02:15
WebSocket 和 HTTP 轮询、长轮询有什么区别?各自适用什么场景?
HTTP轮询是客户端按固定间隔向服务器发请求,无论有无数据都返回响应。实现最简单,但大部分请求是无效的,浪费带宽和服务器资源,延迟取决于轮询间隔。HTTP长轮询是客户端发请求后服务器不立即返回,而是挂起连接直到有新数据或超时才响应,客户端收到后再发下一个请求。实时性明显好于普通轮询,但每次数据推送都需要重新建立连接,且服务器需要维护大量挂起请求。WebSocket通过一次HTTP握手升级为持久连接,建立后双方可以随时主动发数据,是真正的全双工通信。帧头仅2-10字节,开销远低于HTTP每次请求携带的完整头部。三种方式中,WebSocket实时性最好、开销最低,但需要服务器和客户端同时支持;轮询兼容性最强但效率最差;长轮询是两者之间的折中。
追问
性能对比
| 维度 | 轮询 | 长轮询 | WebSocket |
|---|---|---|---|
| 实时性 | 差(依赖间隔) | 较好 | 优 |
| 服务器负载 | 高(大量无效请求) | 中 | 低 |
| 带宽消耗 | 高 | 中 | 低 |
| 实现复杂度 | 低 | 中 | 中 |
| 浏览器兼容性 | 最好 | 好 | 好(IE10+) |
各自适用什么场景?
轮询适合对实时性要求不高的场景,比如配置中心定期拉取最新配置。长轮询适合无需双向通信但需要服务端及时推送的场景,比如消息通知、扫码登录状态检查。WebSocket适合高频双向通信场景,比如即时聊天、协同编辑、实时行情推送、在线游戏。
WebSocket连接如何建立?
客户端发一个特殊的HTTP请求,携带Upgrade: websocket头:
httpGET /ws HTTP/1.1 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
服务器返回101状态码表示协议切换成功:
httpHTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
之后TCP连接保持,双方通过WebSocket帧格式通信,不再走HTTP协议。
长轮询和WebSocket在断线处理上有什么区别?
长轮询本身是"请求-响应"模式,断线后客户端只需重新发请求即可,天然具备重连能力,但重连期间会丢失消息,需要服务端做消息缓存。WebSocket断线后需要客户端主动重连并重新握手,通常配合心跳检测(ping/pong帧)判断连接存活,重连后还需处理会话恢复和消息补发逻辑。