当前位置:首页 > 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 实现长轮询:

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,传统系统可能需要使用长轮询作为降级方案。

js comet实现

标签: jscomet
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url,…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="sli…