当前位置:首页 > 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实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…