HTTP Server-Sent Events (SSE) 协议的基础格式

以下是 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

### Server-Sent Events (SSE) 使用指南 #### SSE简介 Server-Sent Events (SSE) 提供了一种简单、有效的机制用于服务器向浏览器或其他客户端推送实时更新。这种技术特别适合单向通信模式下的低延迟数据传输需求[^1]。 #### 主要特点 - **单一连接**:一旦建立,该连接可以保持开放状态直到不再需要。 - **自动重连支持**:如果网络中断,浏览器会尝试重新连接到服务器。 - **事件驱动模型**:允许定义特定类型的事件监听器以便更灵活地处理不同类型的数据流。 #### 实现流程概述 为了实现一个完整的SSE系统,在服务端需设置好HTTP响应头以告知客户端这是一个持续性的消息源;而在客户端则应利用`EventSource`对象订阅来自指定URL的消息流。 --- ### Go语言中的SSE实现案例 下面展示了一个基于Go语言构建的基础SSE服务器: ```go package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") for i := 0; ; i++ { fmt.Fprintf(w, "data: Message %d\n\n", i) // Flush the buffer to send data immediately. if flusher, ok := w.(http.Flusher); ok { flusher.Flush() } time.Sleep(time.Second) } } func main() { http.HandleFunc("/events", handler) log.Fatal(http.ListenAndServe(":8080", nil)) } ``` 此段代码创建了一个简单的HTTP处理器函数 `handler()` ,它将持续不断地每秒发送一条新消息给已连接上的所有客户端。 --- ### Spring Boot框架下SSE的应用实例 对于采用Java开发的企业级应用程序来说,Spring Boot提供了便捷的方式来集成SSE特性。这里给出一段简化后的配置方法: ```java @RestController public class SseController { private final List<SseEmitter> emitters = new CopyOnWriteArrayList<>(); @GetMapping(value="/register", produces="text/event-stream") public SseEmitter register() throws IOException{ SseEmitter emitter = new SseEmitter(); this.emitters.add(emitter); emitter.onCompletion(() -> this.emitters.remove(emitter)); emitter.onError((e)->this.emitters.remove(emitter)); return emitter; } @PostMapping("/send/{message}") public void sendMessage(@PathVariable String message){ for(SseEmitter emitter : this.emitters){ try { emitter.send(message); } catch(Exception e){} } } } ``` 这段程序片段实现了两个主要的功能点——一是接受新的SSE注册请求并将对应的发射器保存起来等待后续操作;二是提供接口让其他组件可以通过POST请求触发广播消息至所有在线的客户端[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值