You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:47:11