WebSocket连接60秒后触发1006错误求助(附复现代码)
WebSocket连接60秒后错误码1006异常关闭的解决方案
你的问题核心在于自定义文本Ping-Pong未触发标准WebSocket心跳机制,加上使用handleUpgrade后未让ws库接管连接管理,导致底层TCP连接触发默认60秒超时断开。以下是具体修复方案:
方案一:使用ws库内置心跳机制(推荐)
ws库自带标准WebSocket Ping/Pong控制帧处理,浏览器会自动响应服务器发送的Ping,无需手动发送文本消息。
修改server.js
const ws = require("ws") const { createServer } = require("http") // 配置心跳参数:每30秒发送一次Ping,10秒未收到Pong则关闭连接 const server = new ws.Server({ noServer: true, pingInterval: 30000, pingTimeout: 10000 }) createServer((req, res) => { server.handleUpgrade(req, req.socket, Buffer.alloc(0), (socket, req) => { // 必须触发connection事件,让ws库接管连接管理 server.emit('connection', socket, req) socket.on("message", (message) => { console.log(message.toString()) }) socket.on("close", () => { console.log("closed") }) socket.on("error", (err) => { throw err; }) }) }).listen(8000, "127.0.0.1")
修改index.html
移除手动Ping逻辑,浏览器会自动响应服务器的Ping控制帧:
<!DOCTYPE html> <html> <body> <script> var ws = new WebSocket("ws://127.0.0.1:8000"); ws.onopen = (ev) => { ws.send("Hello, Server!"); } ws.onmessage = (ev) => { console.log(ev.data); } ws.onclose = (ev) => { console.log(`Closed ${ev.code} : ${ev.reason}`); } ws.onerror = (err) => { console.log(err); } </script> </body> </html>
方案二:禁用底层Socket超时(保留自定义Ping-Pong)
如果坚持使用自定义文本Ping-Pong,只需禁用底层TCP Socket的默认60秒超时即可:
修改server.js的handleUpgrade回调
server.handleUpgrade(req, req.socket, Buffer.alloc(0), (socket, req) => { // 禁用底层TCP Socket的默认超时 socket._socket.setTimeout(0); socket.on("message", (message) => { if (message == "Ping") socket.send("Pong") console.log(message.toString()) }) socket.on("close", () => { console.log("closed") }) socket.on("error", (err) => { throw err; }) })
客户端保持原Ping逻辑不变,每5秒发送的文本消息会持续重置Socket超时计时器,避免连接断开。
内容的提问来源于stack exchange,提问作者MORAS
相关产品推荐
相关产品推荐

