上一篇
html服务器发送事件
- 行业动态
- 2025-05-01
- 4367
HTML服务器发送事件(SSE)是服务器单向推送数据的技术,客户端通过EventSource接收,保持持久连接
什么是HTML服务器发送事件(Server-Sent Events,SSE)
HTML服务器发送事件(SSE)是一种允许服务器通过HTTP协议向客户端单向推送事件的技术,客户端通过EventSource
接口建立与服务器的持久连接,服务器可以持续向客户端发送数据流,适用于实时更新场景(如股票行情、消息通知等)。
SSE的核心特点
特性 | 描述 |
---|---|
单向通信 | 服务器→客户端,仅服务器可主动推送数据 |
持久连接 | 连接保持直到客户端关闭或服务器终止 |
自动重连 | 断开后会自动尝试重新连接(可配置重试间隔) |
低延迟 | 数据通过TCP连接直接传输,延迟极低 |
文本/JSON格式 | 支持普通文本或JSON格式数据 |
心跳机制 | 服务器定期发送心跳包(或data 字段为空的事件)维持连接 |
SSE与WebSocket的区别
特性 | SSE | WebSocket |
---|---|---|
通信方向 | 单向(服务器→客户端) | 双向 |
协议 | HTTP(GET请求) | WebSocket协议 |
复杂度 | 简单(仅需服务器推送) | 较复杂(需处理握手、双向通信) |
浏览器支持 | IE11+、现代浏览器 | IE10+、现代浏览器 |
适用场景 | 实时更新(如日志、通知) | 双向交互(如聊天、游戏) |
如何创建SSE服务
服务器端(以Node.js为例)
const express = require('express'); const app = express(); app.get('/events', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 发送初始事件 res.write(`data: ${JSON.stringify({ message: 'Welcome!' })} `); // 模拟定时推送数据 setInterval(() => { res.write(`data: ${JSON.stringify({ time: new Date().toLocaleTimeString() })} `); }, 2000); }); app.listen(3000, () => console.log('SSE server running on port 3000'));
客户端(HTML+JS)
<!DOCTYPE html> <html> <body> <div id="messages"></div> <script> const eventSource = new EventSource('/events'); eventSource.onmessage = (event) => { const data = JSON.parse(event.data); document.getElementById('messages').innerHTML += `<p>${data.time || data.message}</p>`; }; eventSource.onerror = (err) => { console.error('SSE connection error:', err); }; </script> </body> </html>
SSE事件格式
单行事件格式
data: <消息内容>
data: {"temperature":25}
多行事件格式
id: <事件ID>
event: <事件名称>
data: <消息内容>
id: 123
event: alert
data: {"type":"fire","location":"Warehouse 3"}
心跳机制与重连策略
- 心跳机制:服务器定期发送空
data
字段事件(如`data:
`)保持连接活跃。
- 重连策略:
- 默认重连间隔:3秒(可通过
retry
参数调整)。 - 客户端自动重连次数无限制,直到成功或手动关闭。
- 默认重连间隔:3秒(可通过
浏览器兼容性
浏览器 | 支持情况 |
---|---|
Chrome | 支持 |
Firefox | 支持 |
Safari | 支持 |
Edge | 支持 |
IE | IE11+支持,需polyfill |
Mobile Safari | 部分版本支持(iOS 12.4+) |
常见问题与解答
问题1:SSE与WebSocket如何选择?
解答:
- 优先选SSE:若只需服务器单向推送(如实时通知、日志流),且无需客户端响应。
- 选WebSocket:若需要双向交互(如聊天、实时协作)。
- SSE优势:实现简单、低资源消耗、自动重连;WebSocket优势:全双工通信。
问题2:如何处理SSE连接中断?
解答:
- 客户端监听
onerror
事件,触发时可记录错误并尝试手动重连。 - 示例代码:
let reconnectAttempts = 0; eventSource.onerror = () => { reconnectAttempts++; if (reconnectAttempts < 5) { setTimeout(() => { eventSource = new EventSource('/events'); // 重新初始化连接 }, 2000); } else { console.error('Max reconnect attempts reached'); } };