当前位置:首页 > JavaScript

js comet实现

2026-02-01 20:18:24JavaScript

Comet 实现方法

Comet 是一种基于 HTTP 长连接的服务器推送技术,允许服务器实时向客户端推送数据。以下是几种常见的 Comet 实现方式:

长轮询(Long Polling)

客户端发送请求后,服务器保持连接打开直到有新数据或超时。数据返回后客户端立即发起新请求。

function longPolling() {
    fetch('/comet-endpoint')
        .then(response => response.json())
        .then(data => {
            console.log('Received:', data);
            longPolling(); // 立即发起新请求
        })
        .catch(error => {
            console.error('Error:', error);
            setTimeout(longPolling, 5000); // 错误时延迟重试
        });
}

永久帧(Forever Frame)

隐藏 iframe 保持与服务器的持久连接,服务器通过 script 标签推送数据。

<iframe id="cometFrame" src="/comet-endpoint" style="display:none"></iframe>

服务器响应格式:

<script>parent.handlePush(data);</script>

Server-Sent Events (SSE)

HTML5 标准协议,使用 EventSource API 建立单向服务器推送通道。

const eventSource = new EventSource('/comet-endpoint');
eventSource.onmessage = (event) => {
    console.log('New message:', event.data);
};
eventSource.onerror = () => {
    console.error('SSE error');
};

WebSocket

全双工通信协议,适合需要双向实时通信的场景。

const socket = new WebSocket('wss://example.com/comet');
socket.onmessage = (event) => {
    console.log('Message:', event.data);
};
socket.onopen = () => {
    socket.send('Client ready');
};

服务器端实现示例(Node.js)

使用 Express 实现长轮询:

js comet实现

const express = require('express');
const app = express();
const clients = [];

app.get('/comet', (req, res) => {
    clients.push(res); // 存储响应对象
    req.on('close', () => {
        clients.splice(clients.indexOf(res), 1); // 清理断开连接
    });
});

function pushData(data) {
    clients.forEach(res => {
        res.json(data); // 向所有客户端推送
    });
    clients.length = 0; // 清空客户端列表
}

性能优化建议

  • 设置合理的超时时间(通常 25-30秒)
  • 实现连接断开后的自动重连机制
  • 对非活动连接进行心跳检测
  • 考虑使用消息队列管理推送事件
  • 在浏览器端实现退避策略避免频繁重试

适用场景比较

技术 协议 方向性 延迟 浏览器支持
长轮询 HTTP 单向 中等 广泛
SSE HTTP 单向 现代浏览器
WebSocket WS 双向 最低 现代浏览器
Forever Frame HTTP 单向 中等 广泛

选择实现方式时应考虑项目需求、浏览器兼容性和服务器基础设施。现代应用推荐优先考虑 SSE 或 WebSocket,传统系统可能需要使用长轮询作为降级方案。

标签: jscomet
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js树实现

js树实现

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

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…