WebSocket是浏览器与服务器间全双工、持久化的实时通信协议,通过HTTP握手升级后长期连接,支持服务端主动推送、轻量数据帧及文本/二进制传输。
WebSocket 是浏览器与服务器之间建立的全双工、持久化通信通道,能实现真正的实时数据交换,比轮询或长连接更高效。
HTTP 是“请求-响应”模式,每次通信都要重新握手,不适合高频交互。WebSocket 在初始 HTTP 握手后升级为独立协议,连接保持打开状态,双方可随时主动发消息。
浏览器原生支持 WebSocket 构造函数,用法简单:
const ws = new WebSocket('wss://example.com/chat'); // wss 是加密版
ws.onopen = () => {
console.log('连接成功');
ws.send('Hello Server');
};
ws.onmessage = (event) => {
console.log('收到消息:', event.data); // 可能是字符串或 Blob
};
ws.onerror = (error) => {
console.error('连接出错', error);
};
ws.onclose = () => {
console.log('连接已关闭');
};
注意:必须等 onopen 触发后再调用 send(),否则会报错;发送前建议检查 ws.readyState === WebSocket.OPEN。
浏览器不能直接连数据库或文件系统,必须有服务端 WebSocket 服务器中转:
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.readyState === WebSocket.OPEN) {
client.send(`广播:${data}`);
}
});
});
ws.on('close', () => {
console.log('用户断开');
});
});
真实项目中通常用成熟的方案,如 Socket.IO(兼容性更好、自带心跳和降级)、ws(轻量高效)、或云服务(如 Pusher、Firebase Realtime Database)。
WebSocket 看似简单,但线上容易出问题:
1s、2s、4s 间隔)this 正确基本上就这些。WebSocket 不复杂,但容易忽略容错和状态管理,真正稳定运行靠的是细节处理。