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

如何设置QWebSocketServer长时间无通信时的自动断开超时时间至2小时以上

你遇到的报错是QWebSocket内置的空闲超时检测触发的默认断开逻辑,Qt 5.10及以上版本的QWebSocket默认空闲超时为30分钟,链路无数据传输时会主动关闭连接,可通过以下方案调整超时时间:

解决方案

1. C++服务端修改空闲超时配置

直接在客户端连接上来的QWebSocket实例上调用setIdleTime()方法即可修改超时阈值,参数单位为毫秒,2小时对应的数值为2*60*60*1000 = 7200000:

// 在QWebSocketServer的newConnection信号对应的槽函数中修改
void YourServerClass::onNewClientConnected()
{
    QWebSocket *clientSocket = m_websocketServer->nextPendingConnection();
    // 设置空闲超时为2小时,传入0可以完全禁用空闲超时检测
    clientSocket->setIdleTime(7200000);

    // 原有逻辑保持不变:绑定信号、关联QWebChannel等
    QWebChannel *webChannel = new QWebChannel(this);
    webChannel->registerObject("backend", this);
    webChannel->connectTo(clientSocket);
}

配置完成后可通过以下代码验证参数是否生效:

qDebug() << "当前配置的空闲超时时间:" << clientSocket->idleTime() << "ms";

2. 可选:JS客户端增加心跳逻辑

部分浏览器的WebSocket实现也存在内置空闲超时规则,为了避免浏览器侧主动断开链路,可增加轻量心跳机制:

const HEARTBEAT_INTERVAL = 15 * 60 * 1000; // 每15分钟发一次心跳
let heartbeatTimer = null;

// 建立WebSocket连接后启动心跳
const ws = new WebSocket("ws://你的服务端地址");
ws.onopen = () => {
    // 启动心跳定时器
    heartbeatTimer = setInterval(() => {
        if (ws.readyState === WebSocket.OPEN) {
            ws.send(JSON.stringify({type: "heartbeat"}));
        }
    }, HEARTBEAT_INTERVAL);

    // 原有QWebChannel初始化逻辑保持不变
    new QWebChannel(ws, (channel) => {
        window.backend = channel.objects.backend;
    });
};

服务端收到心跳包后可以直接返回空响应,或者不做任何处理,只要有数据传输就会重置QWebSocket的空闲超时计时。

注意:如果你使用的Qt版本低于5.10,没有内置setIdleTime()接口,只能通过上述心跳方案维持链路,心跳间隔需要小于30分钟,避免链路被底层主动断开。

内容的提问来源于stack exchange,提问作者moya mo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:54:05