上一篇
html5服务器端推送事件
- 行业动态
- 2025-05-10
- 9
HTML5服务器端推送事件(SSE)允许服务器通过持久连接主动向客户端推送数据,无需客户端轮询,适用于实时更新场景,如新闻或股票,使用EventSource接口
HTML5服务器端推送事件(Server-Sent Events, SSE)详解
基本原理
Server-Sent Events (SSE) 是一种基于 HTTP 协议的服务器向客户端单向推送数据的技术,客户端通过 EventSource
接口建立与服务器的持久连接,服务器通过该连接持续发送事件流,客户端接收并处理事件。
- 核心特点:
- 单向通信(服务器 → 客户端)
- 自动重连(连接断开时客户端自动尝试重新连接)
- 文本流格式(通常为 JSON 或自定义文本)
- 低延迟(适合实时数据更新)
技术对比:SSE vs WebSocket
特性 | SSE | WebSocket |
---|---|---|
通信方向 | 单向(服务器 → 客户端) | 双向 |
协议基础 | HTTP/SSE | WebSocket 协议 |
复杂度 | 简单(仅需服务器支持) | 较复杂(需处理握手、心跳、二进制数据) |
浏览器支持 | IE11+、现代浏览器 | IE10+、现代浏览器 |
适用场景 | 实时更新(如股票、日志) | 双向交互(如聊天、游戏) |
自动重连 | 内置支持 | 需手动实现 |
实现步骤
(1) 服务器端实现
Node.js 示例(Express + SSE):
const express = require('express'); const app = express(); // SSE 路由 app.get('/events', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.flushHeaders(); // 定时推送事件 setInterval(() => { const data = JSON.stringify({ time: new Date(), message: 'Hello SSE' }); res.write(`data: ${data}
); // 每个事件以
` 分隔
}, 1000);
// 连接关闭时清理资源
req.on('close', () => {
console.log('Client disconnected');
});
app.listen(3000, () => console.log(‘Server running on port 3000’));
## (2) 客户端实现
HTML + JavaScript 示例:
```html
<div id="messages"></div>
<script>
const eventSource = new EventSource('/events');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
const msgDiv = document.createElement('div');
msgDiv.textContent = `${data.time}: ${data.message}`;
document.getElementById('messages').appendChild(msgDiv);
};
eventSource.onerror = (err) => {
console.error('SSE error:', err);
};
</script>
使用场景
场景 | 说明 |
---|---|
实时日志监控 | 服务器推送日志到客户端(如 DevOps 工具) |
股票行情更新 | 实时推送股票价格变动 |
消息通知系统 | 推送实时通知(如聊天室的系统消息) |
IoT 数据流 | 设备传感器数据实时展示 |
注意事项
- 跨域限制:需服务器支持 CORS(
Access-Control-Allow-Origin
)。 - 心跳机制:SSE 默认无心跳,需服务器定期发送注释事件(如 )维持连接。
- 浏览器兼容性:IE11 部分支持,移动端需测试。
- 断线重连:客户端自动重连,但需处理重复数据或状态同步。
相关问题与解答
问题1:SSE 与 WebSocket 如何选择?
- 答:
- 若只需服务器向客户端单向推送(如实时更新),优先选 SSE(实现简单、低功耗)。
- 若需双向交互(如聊天、游戏),则选 WebSocket。
- 若需兼容低版本浏览器(如 IE10),需权衡功能与兼容性。
问题2:SSE 如何实现高效推送?
- 答:
- 合并小数据包:避免频繁发送小事件,可批量拼接数据后统一推送。
- 压缩数据:启用 GZIP 压缩减少带宽占用(需客户端支持解压)。
- 事件分级:按优先级分类事件(如关键数据立即推送,次要数据延迟推送)。