WebSocket是浏览器与服务器间持久化全双工通信通道,通过一次Upgrade握手复用TCP连接,以帧轻量传输数据,解决轮询延迟高、开销大等问题,适用于聊天、实时通知等场景。
WebSocket 是浏览器与服务器之间建立的持久化、全双工通信通道,能真正实现客户端和服务器实时双向收发数据。它不像 HTTP 那样每次请求都要重新握手、带大量头部,而是通过一次升级(Upgrade)握手后,复用同一个 TCP 连接长期保持连接,后续数据以帧(frame)形式轻量传输。
传统轮询(Polling)或长轮询(Long Polling)有明显缺陷:频繁建连开销大、延迟高、服务器压力大、无法真正“即时”响应。而 WebSocket 解决了这些——连接建立后,双方随时可主动发消息,适合聊天、协作编辑、实时通知、行情推送等场景。
前端只需一行代码即可发起连接(注意协议是 ws:// 或安全的 wss://):
const ws = new WebSocket('wss://example.com/chat');
之后监听关键事件:
event.data 可能是字符串或 Blob)event.code 和 event.reason 判断原因)发送消息也很简单:ws.send('hello'),支持字符串、ArrayBuffer、Blob。
主流语言都有成熟 WebSocket 库。以 Node.js 的 ws 库为例:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws, req) => {
console.log('新客户端已连接');
ws.on('message', (data) => {
console.log('收到:', data.toString());
// 广播给所有其他客户端(不含自己)
wss.clients.forEach(client => {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(`广播:${data}`);
}
});
});
ws.on('close', () => console.log('客户端断开'));
});
关键点:
ws 实例,可绑定独立事件readyState 再发送,避免因连接异常导致报错
ping / expect pong),防止中间代理断连WebSocket 很强大,但不是“万能胶”。用之前得想清楚:
wss://(本地 ws://localhost 除外)ws.close(),避免内存泄漏基本上就这些。WebSocket 本身协议不复杂,难的是围绕它构建健壮、可维护的实时逻辑。