⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

12.4.1 为什么需要实时通信——WebSocket vs HTTP:长连接的优势

一句话破题

HTTP 是"你问我答",WebSocket 是"保持通话"——后者让服务器能在任何时候主动给你发消息。

本质还原:两种通信模式

HTTP 轮询的问题

javascript
// 轮询:每秒询问一次有没有新消息
setInterval(async () => {
  const response = await fetch('/api/messages');
  const messages = await response.json();
  updateUI(messages);
}, 1000);

问题:

  • 浪费资源:大多数请求返回"没有新消息"
  • 延迟高:最坏情况下延迟 = 轮询间隔
  • 服务器压力:1000 用户 × 每秒 1 次 = 1000 QPS

WebSocket 的优势

javascript
// WebSocket:建立一次连接,持续接收消息
const ws = new WebSocket('wss://example.com/socket');

ws.onmessage = (event) => {
  const message = JSON.parse(event.data);
  updateUI(message);
};

// 发送消息也很简单
ws.send(JSON.stringify({ text: 'Hello!' }));
特性HTTP 轮询WebSocket
连接方式每次请求新连接持久连接
通信方向单向(客户端发起)双向
实时性取决于轮询间隔毫秒级
资源消耗
服务器推送不支持原生支持

WebSocket 握手过程

WebSocket 连接从 HTTP 升级开始:

// 客户端请求
GET /socket HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

// 服务器响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

握手完成后,连接从 HTTP 升级为 WebSocket,双方可以自由发送数据帧。

何时使用 WebSocket

场景推荐方案
即时通讯、聊天WebSocket
实时协作编辑WebSocket
股票行情、体育比分WebSocket / SSE
表单提交、API 调用HTTP
文件下载HTTP
偶尔获取数据(间隔 > 30s)HTTP

AI 协作指南

  • 核心意图:让 AI 帮你理解何时以及如何使用 WebSocket。
  • 需求定义公式"请解释 WebSocket 和 HTTP 长轮询的区别,并说明在什么场景下应该选择哪种方案。"
  • 关键术语WebSocket握手 (handshake)全双工 (full-duplex)持久连接 (persistent connection)

避坑指南

  • 不要为所有场景都用 WebSocket:简单的 CRUD 操作用 HTTP 更合适。
  • 注意连接限制:浏览器对单个域名的 WebSocket 连接数有限制。
  • 考虑负载均衡:WebSocket 的长连接对负载均衡有特殊要求(需要 sticky session)。