js comet实现
实现 Comet 技术的 JavaScript 方法
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); // 错误时延迟重试
});
}
服务器发送事件 (Server-Sent Events, SSE)
使用 EventSource API 建立持久连接,服务器可以通过 HTTP 流发送事件。

客户端代码:
const eventSource = new EventSource('/sse-endpoint');
eventSource.onmessage = (event) => {
console.log('New message:', event.data);
};
eventSource.onerror = (error) => {
console.error('SSE error:', error);
};
服务器需要设置响应头:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
WebSocket
虽然不属于传统 Comet 技术,但 WebSocket 提供了全双工通信能力。
const socket = new WebSocket('ws://yourserver.com/comet');
socket.onopen = () => {
console.log('WebSocket connected');
};
socket.onmessage = (event) => {
console.log('Message:', event.data);
};
socket.onclose = () => {
console.log('WebSocket disconnected');
};
Forever Iframe
隐藏的 iframe 与服务器保持长连接,通过 parent 窗口通信。
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = '/comet-iframe';
document.body.appendChild(iframe);
window.onmessage = (event) => {
if (event.origin !== 'https://yourserver.com') return;
console.log('Received:', event.data);
};
实现注意事项
- 服务器需要支持持久连接和异步处理
- 考虑连接失败时的重试机制
- 生产环境建议使用成熟的库如 Socket.IO
- 注意浏览器兼容性问题(特别是旧版 IE)
每种方法都有其适用场景,选择时应考虑项目需求、浏览器支持和服务器能力。






