WebSocket通过HTTP升级握手建立TCP上的持久双向通信,客户端用new WebSocket()连接并监听onopen/onmessage,服务端用ws库广播消息,需处理重连、心跳、鉴权等优化。
用 JavaScript 实现实时聊天应用,核心在于建立客户端与服务端之间的持久、双向通信通道——WebSocket 正是为此而生。它不像 HTTP 那样每次请求都要重新握手,而是建立一次连接后,双方可以随时互相发消息,延迟低、开销小。
WebSocket 协议在 TCP 之上,通过一次 HTTP 升级(Upgrade)握手完成连接建立。成功后,连接保持打开状态,客户端和服务端都能主动发送数据(文本或二进制),无需轮询或长连接模拟。
关键点:
HTML 中放一个输入框、一个发送按钮、一个消息列表容器:
JavaScript 初始化连接并处理交互:
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => {
console.log('已连接到聊天服务器');
};
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
const p = document.createElement('p');
p.textContent = `[${msg.user}]: ${msg.text}`;
document.getElementById('chatBox').appendChild(p);
document.getElementById('chatBox').scrollTop = document.getElementById('chatBox').scrollHeight;
};
ws.onerror = (err) => console.error('WebSocket 错误:', err);
ws.onclose = () => console.log('连接已关闭');
document.getElementById('sendBtn').onclick = () => {
const input = document.getElementById('msgInput');
const text = input.value.trim();
if (text && ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ user: '游客', text }));
input.value = '';
}
};
安装依赖:npm install ws
创建 server.js:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
// 存储所有连接的客户端(简单场景可用数组,生产环境建议用 Map 或 Redis)
const clients = new Set();
wss.on('connection', (ws, req) => {
console.log('新用户连接');
clients.add(ws);
ws.on('message', (data) => {
try {
const msg = JSON.parse(data);
// 广播给所有客户端(包括自己),也可排除发送者
clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify({
user: msg.user || '匿名',
text: msg.text || ''
}));
}
});
} catch (e) {
console.error('消息解析失败:', e);
}
});
ws.on('close', () => {
console.log('用户断开');
clients.delete(ws);
});
});
console.log('WebSocket 服务运行在 ws://localhost:8080');
运行:n
ode server.js,前端即可连接。
原生 WebSocket 功能精简,实际项目中常需补充能力:
基本上就这些。WebSocket 本身不复杂,但容易忽略错误处理、连接状态管理和消息可靠性。从原生入手理解原理,再过渡到成熟方案,是稳妥的路径。