1. 什么是Server-Sent Events(SSE)?
想象一下你在餐厅点餐,服务员每隔几分钟就会主动过来告诉你:"您的前菜已经准备好了"、"主菜正在烹饪中"、"甜点还需要5分钟"。这就是SSE的工作方式——服务器主动向客户端推送更新,而不需要客户端反复询问。
Server-Sent Events(SSE)是一种基于HTTP的服务器推送技术,它允许服务器单向、持续地向客户端发送数据更新。与需要双向通信的WebSocket不同,SSE专注于服务器到客户端的单向数据流,这使得它在某些场景下更加轻量和高效。
我第一次接触SSE是在开发一个实时天气预报应用时。当时尝试了轮询和WebSocket方案,发现要么太耗资源,要么实现太复杂。直到发现SSE这个"中间路线"——它像是一条永不挂断的电话线,服务器可以随时在这头说话,而客户端只需要安静地听着。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SSE的核心工作原理
2.1 底层通信机制
SSE的魔法始于一个特殊的HTTP请求。当客户端创建EventSource对象时,它会向服务器发送一个普通的HTTP请求,但有两个关键区别:
- 服务器在响应头中设置
Content-Type: text/event-stream - 连接会保持打开状态(长连接),而不是立即关闭
javascript复制// 客户端代码示例
const eventSource = new EventSource('/updates');
在服务器端,响应会以特定的格式持续发送数据。每条消息由data:前缀开始,以两个换行符\n\n结束:
code复制data: 这是第一条消息\n\n
data: 这是第二条消息\n\n
2.2 事件流格式详解
SSE协议定义了多种消息类型,让通信更加灵活:
-
普通消息:最基本的格式,以
data:开头code复制data: 你好,世界!\n\n -
多行消息:可以在一条消息中包含多行内容
code复制data: 第一行\n data: 第二行\n\n -
命名事件:可以为不同类型的事件指定名称
code复制event: notification\n data: 您有新的消息\n\n -
重连控制:服务器可以建议客户端断开后重连的间隔
code复制retry: 5000\n\n
我在实际项目中发现,合理使用这些消息格式可以显著提升应用的可维护性。比如用命名事件区分系统通知和业务数据,客户端就能更精准地处理不同类型的信息。
3. SSE与WebSocket的深度对比
3.1 协议特性比较
| 特性 | SSE | WebSocket |
|---|---|---|
| 通信 |
