如何设置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
相关产品推荐
相关产品推荐

