为 Websocket 添加基于时间的心跳功能以避免自动关闭。可以在
服务器
端定时发送 ping 消息,如果
客户端
在一段时间内没有收到 pong
消息
,就认为连接已经断开,并触发关闭事件。以下是一个使用 Node.js 和 ws 模块的示例代码:
const WebSocket = require('ws');
const ws = new WebSocket('ws://example.com');
// 定义心跳间隔时间为 30s
const heartbeatInterval = 30000;
let heartbeatTimer;
// 发送 ping 消息并开始计时
function sendHeartbeat() {
ws.send(JSON.stringify({ type: 'ping' }));
heartbeatTimer = setTimeout(() => {
ws.close();
}, heartbeatInterval);
ws.on('open', () => {
console.log('连接已打开');
// 连接成功后立即发送第一条心跳消息
sendHeartbeat();
ws.on('message', (data) => {
if (data === 'pong') {
// 收到 pong 消息,重置计时器
clearTimeout(heartbeatTimer);
sendHeartbeat();
} else {
console.log(`收到消息:${data}`);
ws.on('close', () => {
console.log('连接已关闭');
clearTimeout(heartbeatTimer);
ws.on('error', (err) => {
console.log(`发生错误:${err.message}`);
在以上代码中,每次收到 pong 消息时都会重置计时器并再次发送心跳消息。如果在心跳间隔内没有收到 pong 消息,则服务器会自动关闭 Websocket 连接,并触发 close 事件。注意不要将心跳间隔时间设置得太短或太长,以避免对网络带宽造成过大的影响。