当前位置:首页 > JavaScript

js实现心跳

2026-04-06 06:38:55JavaScript

使用 WebSocket 实现心跳机制

WebSocket 本身支持心跳机制,通过定时发送 ping/pong 帧保持连接活跃。

js实现心跳

const socket = new WebSocket('ws://example.com');

// 发送心跳
const heartbeatInterval = setInterval(() => {
    if (socket.readyState === WebSocket.OPEN) {
        socket.send('ping');
    }
}, 30000);

// 接收心跳响应
socket.addEventListener('message', (event) => {
    if (event.data === 'pong') {
        console.log('Connection is alive');
    }
});

// 关闭时清除定时器
socket.addEventListener('close', () => {
    clearInterval(heartbeatInterval);
});

使用 AJAX 轮询模拟心跳

在没有 WebSocket 的情况下,可以通过定时 AJAX 请求模拟心跳。

js实现心跳

function sendHeartbeat() {
    fetch('/heartbeat', {
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        }
    })
    .then(response => {
        if (!response.ok) {
            throw new Error('Heartbeat failed');
        }
        return response.json();
    })
    .then(data => {
        console.log('Heartbeat response:', data);
    })
    .catch(error => {
        console.error('Heartbeat error:', error);
    });
}

// 每30秒发送一次心跳
const heartbeatInterval = setInterval(sendHeartbeat, 30000);

// 停止心跳
function stopHeartbeat() {
    clearInterval(heartbeatInterval);
}

使用 EventSource 实现心跳

Server-Sent Events (SSE) 也可以用于实现心跳机制。

const eventSource = new EventSource('/events');

eventSource.addEventListener('heartbeat', (event) => {
    console.log('Heartbeat received:', event.data);
});

eventSource.onerror = (error) => {
    console.error('EventSource failed:', error);
    eventSource.close();
};

心跳机制的最佳实践

  1. 合理设置心跳间隔:通常 30-60 秒,太短会增加服务器负担,太长可能导致连接超时。
  2. 处理断线重连:在心跳失败时实现自动重连机制。
  3. 减少数据量:心跳消息应尽量小,通常只需一个简单的字符串。
  4. 多协议支持:根据环境选择 WebSocket、AJAX 或 SSE。

断线重连实现示例

let reconnectAttempts = 0;
const maxReconnectAttempts = 5;

function connect() {
    const socket = new WebSocket('ws://example.com');

    socket.addEventListener('open', () => {
        reconnectAttempts = 0;
    });

    socket.addEventListener('close', () => {
        if (reconnectAttempts < maxReconnectAttempts) {
            const delay = Math.min(1000 * (reconnectAttempts + 1), 5000);
            setTimeout(connect, delay);
            reconnectAttempts++;
        }
    });
}

connect();

性能优化建议

  1. 使用二进制数据代替文本减少带宽消耗
  2. 实现指数退避算法控制重连频率
  3. 在页面隐藏时降低心跳频率
  4. 使用 Web Workers 处理心跳逻辑避免阻塞主线程

标签: js
分享给朋友:

相关文章

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…