WebSocket心跳检测如何避免频繁断开?
我用WebSocket做在线状态检测时,设置了每30秒发送心跳包,但偶尔还是会触发onclose事件。看服务器日志显示连接正常,可能是心跳间隔设置太短了?
我这样写的检测逻辑:
let heartbeatTimeout;
const ws = new WebSocket('wss://api.example.com');
ws.onopen = () => {
sendHeartbeat();
};
function sendHeartbeat() {
ws.send(JSON.stringify({ type: 'heartbeat' }));
heartbeatTimeout = setTimeout(sendHeartbeat, 30000);
}
ws.onclose = () => {
console.log('连接断开!'); // 这里频繁触发
};
试过改成45秒间隔后问题减少,但产品要求最长离线时间不超过40秒。有没有更好的实现方式?比如结合超时重试和状态监测?
在发送心跳后启动一个超时检测,如果在指定时间内未收到响应,则立即重试。同时把心跳间隔适当延长到35秒,结合超时重试和响应确认机制,确保连接稳定性。
试试这个方法:增加一个心跳响应的超时机制,只有在收到服务器的心跳响应后才重置定时器。如果超过一定时间没收到响应,就主动断开并重连。
代码可以这么改:
这样既保证了心跳间隔不超出40秒,又能在服务器无响应时及时处理。关键是不要只依赖发心跳包的时间,还要检查是否有正常收到来自服务器的响应。
这种实现方式虽然稍微复杂点,但稳定性和可靠性会高很多。折腾过几次后你会发现,WebSocket真的很考验细节处理。