
1) 【一句话结论】通过定时发送心跳包检测连接状态,断开后采用指数退避策略重连,并控制重连频率以避免资源浪费。
2) 【原理/概念讲解】
WebSocket的长连接在网络不稳定时可能断开,心跳机制的核心是“定期发送心跳包+服务器响应确认”。客户端设置定时器(如每30秒),向服务器发送心跳包(可自定义结构,如{type: 'heartbeat', timestamp: Date.now()});服务器收到后返回pong响应。客户端通过是否收到pong判断连接是否存活:若连续多次(如3次)未收到响应,则判定连接断开。重连逻辑需应对网络抖动(如短暂丢包),避免频繁重连。类比:心跳监测类似“心跳信号”,心脏每跳动一次,若一段时间无反应,就怀疑连接异常,然后尝试重新联系(重连)。
3) 【对比与适用场景】
| 策略类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 固定间隔重连 | 每隔固定时间重连(如3秒) | 简单,但可能因网络抖动频繁重连 | 网络稳定、重连成本低的场景 | 可能因短暂丢包触发多次重连 |
| 指数退避重连 | 重连间隔按指数增长(如1→2→4秒) | 避免频繁重连,适应网络恢复 | 网络不稳定、重连成本高的场景 | 需设置最大重连时间,防止无限等待 |
| 随机退避重连 | 在固定间隔内随机选择重连时间 | 减少重连集中性,避免服务器压力集中 | 高并发重连场景 | 需合理设置随机范围 |
4) 【示例】
// 心跳相关变量
let heartbeatTimer;
const HEARTBEAT_INTERVAL = 30000; // 30秒发送一次心跳
const MAX_HEARTBEAT_ATTEMPTS = 3; // 连续3次未收到响应判定断开
let heartbeatAttempts = 0;
// 发送心跳
function sendHeartbeat() {
ws.send(JSON.stringify({ type: 'heartbeat', ts: Date.now() }));
heartbeatAttempts = 0; // 重置尝试次数
}
// 监听pong响应
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'pong') {
heartbeatAttempts = 0; // 收到响应,重置尝试次数
}
};
// 定时发送心跳
heartbeatTimer = setInterval(sendHeartbeat, HEARTBEAT_INTERVAL);
// 处理连接断开
function handleConnectionLost() {
clearInterval(heartbeatTimer); // 停止心跳
// 指数退避重连
let retryInterval = 1000; // 初始1秒
const maxRetryInterval = 30000; // 最大30秒
const maxRetries = 5; // 最大重试次数
let retryCount = 0;
function retryConnect() {
if (retryCount >= maxRetries) {
console.error('重连失败,连接丢失');
return;
}
retryCount++;
setTimeout(() => {
ws = new WebSocket('ws://example.com'); // 重新建立连接
// 重新绑定事件和心跳
// ...
retryConnect(); // 继续重试
}, retryInterval);
retryInterval = Math.min(retryInterval * 2, maxRetryInterval); // 指数增长
}
retryConnect();
}
// 监听连接状态变化
ws.onclose = () => {
handleConnectionLost();
};
5) 【面试口播版答案】
“面试官您好,关于PC客户端使用WebSocket实现心跳机制检测网络连接状态,以及断开后的重连逻辑,我的思路是这样的:首先,心跳机制的核心是通过定时发送心跳包(比如每30秒发送一次)到服务器,服务器返回响应(pong)来确认连接存活。客户端会设置一个定时器,如果连续3次未收到响应,就判定连接断开。然后,断开后的重连逻辑采用指数退避策略,初始重连间隔1秒,每次失败后翻倍,直到最大30秒,避免频繁重连导致资源浪费。同时,还要处理服务器端可能的心跳响应,比如确保服务器正确返回pong,否则客户端会误判连接状态。另外,为了避免假死,重连时需要控制频率,比如设置最大重试次数,防止无限等待。”
6) 【追问清单】
7) 【常见坑/雷区】