以下是 HTTP Server-Sent Events (SSE) 协议的基础格式详解:
---
一、协议基础
SSE 是 HTML5 规范中定义的服务器到客户端的**单向通信协议**,特点:
- 基于 HTTP 长连接(`Content-Type: text/event-stream`)
- 使用纯文本格式传输数据
- 默认支持断线重连
- 浏览器原生支持(通过 `EventSource` API)
---
二、核心消息格式
每条消息由 **字段行** 和 **空行终止符** 组成:
```text
[field]: [value]\n
[field]: [value]\n
\n
```
#### **1. 必需字段**
- **`data` 字段**
定义消息内容,可多行传输:
```text
data: { "status": "success" }\n
data: Continued on next line\n
\n
```
客户端接收时会合并为完整数据:`{ "status": "success" }\nContinued on next line`
#### **2. 可选字段**
- **`event` 字段**
定义事件类型(默认类型为 `message`):
```text
event: status_update\n
data: 系统已启动\n
\n
```
- **`id` 字段**
设置消息ID(用于断线重连时定位):
```text
id: 42\n
data: 当前温度:23℃\n
\n
```
- **`retry` 字段**
指定重连时间(毫秒):
```text
retry: 3000\n
\n
```
---
三、技术规范要点
1. **编码要求**
- 必须使用 UTF-8 编码
- 换行符统一为 `\n`(Unix风格)
2. **消息终止**
每个消息块必须由两个连续的换行符 `\n\n` 结束
3. **BOM处理**
禁止在数据流开头添加字节顺序标记(BOM)
4. **MIME类型**
响应头必须包含:
```http
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
```
---
四、完整示例
#### 服务器响应示例:
```text
HTTP/1.1 200 OK
Content-Type: text/event-stream
Transfer-Encoding: chunked
event: alert
data: {"level": "critical", "msg": "CPU过载"}
id: 101
data: 当前用户数:256
data: 在线设备数:89
retry: 10000
```
#### 客户端处理(JavaScript):
```javascript
const eventSource = new EventSource('/stream');
eventSource.addEventListener('alert', (e) => {
console.log(JSON.parse(e.data));
});
eventSource.onmessage = (e) => {
console.log('未命名事件:', e.data);
};
```
---
五、特殊场景处理
1. **多行数据**
通过重复 `data:` 行实现:
```text
data: {\n
data: "id": 123,\n
data: "name": "示例"\n
data: }\n
\n
```
2. **注释行**
以 `:` 开头的行会被忽略:
```text
: 这是心跳检测时间戳 1630000000\n
data: ping\n
\n
```
3. **错误恢复**
当连接中断时,浏览器会自动尝试重连(遵循 `retry` 设定)
---
六、协议对比
| 特性 | SSE | WebSocket |
|--------------------|-----------------|-------------------|
| 通信方向 | 单向(服务端→客户端) | 双向 |
| 协议基础 | HTTP | 独立协议 (ws/wss) |
| 数据格式 | 文本 | 二进制/文本 |
| 自动重连 | ✅ | ❌ |
| CORS处理 | 需要配置 | 需要配置 |
---
通过这种规范化的消息格式,SSE 实现了高效的服务器推送能力,适用于股票行情、实时日志、进度通知等场景。
---DEEPSEEK