
WebSocket 在浏览器中运行 60 秒后报错 1006(连接异常中断),即使已实现每 5 秒 Ping-Pong 心跳,根本原因在于 Node.js http.Server 默认超时机制与 ws 手动升级流程不兼容,需正确绑定升级事件或改用内置集成模式。
websocket 在浏览器中运行 60 秒后报错 1006(连接异常中断),即使已实现每 5 秒 ping-pong 心跳,根本原因在于 node.js `http.server` 默认超时机制与 `ws` 手动升级流程不兼容,需正确绑定升级事件或改用内置集成模式。
在基于 ws 库搭建 WebSocket 服务时,若采用 noServer: true 模式并手动调用 handleUpgrade(),却未在 http.Server 实例上显式监听 upgrade 事件,Node.js 内置的 HTTP 服务器会将底层 TCP 连接视为空闲(idle),并在默认 60 秒超时后主动终止 socket —— 此行为独立于 WebSocket 协议层的 ping/pong,因此客户端收到的是无 reason 的 1006 错误(表示连接被底层意外关闭),且 onerror 不触发。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
✅ 正确做法:两种可靠方案
方案一:显式监听 upgrade 事件(推荐用于多协议共存场景)
const ws = require('ws');
const { createServer } = require('http');
const wss = new ws.Server({ noServer: true });
wss.on('connection', (socket) => {
console.log('Client connected');
socket.on('message', (data) => {
const msg = data.toString();
if (msg === 'Ping') socket.send('Pong');
console.log('Received:', msg);
});
socket.on('close', () => console.log('Client disconnected'));
socket.on('error', (err) => console.error('Socket error:', err));
});
// 关键:必须监听 upgrade 并委托给 wss.handleUpgrade
const server = createServer();
server.on('upgrade', (req, socket, head) => {
wss.handleUpgrade(req, socket, head, (ws) => {
wss.emit('connection', ws, req); // 触发 connection 事件
});
});
server.listen(8000, '127.0.0.1', () => {
console.log('HTTP + WebSocket server running on ws://127.0.0.1:8000');
});方案二:使用 ws.Server({ server }) 自动集成(最简健壮方案)
const ws = require('ws');
const { createServer } = require('http');
const server = createServer();
const wss = new ws.Server({ server }); // 自动绑定 upgrade 事件
wss.on('connection', (socket) => {
console.log('New WebSocket connection');
socket.on('message', (data) => {
const msg = data.toString();
if (msg === 'Ping') socket.send('Pong');
console.log('→', msg);
});
socket.on('close', () => console.log('Connection closed'));
socket.on('error', (err) => console.error('WS Error:', err));
});
server.listen(8000, '127.0.0.1');⚠️ 注意事项
- 1006 错误 不是 WebSocket 协议错误,而是底层 TCP 连接被 HTTP 服务器强制关闭,因此心跳无法缓解;
- 浏览器端无需修改(你的 Ping-Pong 逻辑本身正确),问题纯属服务端握手/生命周期管理缺陷;
- 若需自定义 HTTP 路由(如 /api 和 /ws 共存),务必使用方案一,并确保 upgrade 事件处理逻辑覆盖所有 WebSocket 升级请求;
- 生产环境建议启用 wss.options = { clientTracking: true, maxPayload: 10 * 1024 * 1024 } 等安全配置。
正确配置后,WebSocket 连接将稳定保持数小时甚至更久,彻底规避 60 秒 1006 中断问题。

















