什么是SSE?SSE与WebSocket的对比分析
创作时间:
作者:
@小白创作中心
什么是SSE?SSE与WebSocket的对比分析
引用
CSDN
1.
https://blog.csdn.net/zfj321/article/details/145652403
SSE(Server-Sent Events)是一种基于HTTP的轻量级协议,允许服务器主动向客户端推送实时数据。它适用于需要服务器单向实时通信的场景,如新闻推送、股票行情等。本文将详细介绍SSE的核心机制、工作原理及其与WebSocket的对比,并通过具体的代码示例帮助读者快速上手。
SSE 核心机制
1. 通信模式
- 单向性:仅支持服务器到客户端的单向通信(客户端无法通过 SSE 向服务器发送数据)。
- 长连接:客户端通过一次 HTTP 请求建立连接,服务器保持连接打开状态,持续发送数据流。
2. 协议特性
- 基于 HTTP:使用标准 HTTP 协议,无需额外协议支持(如 WebSocket)。
- 文本格式:数据以纯文本形式传输(支持 UTF-8 编码),格式灵活。
- 事件驱动:数据可附带自定义事件名称(如
message、update),客户端可监听特定事件。
3. 数据格式
每条消息由以下字段组成(以换行符分隔):
event: <event-name> // 自定义事件名称(可选)
data: <message-content> // 消息内容(可多行)
id: <message-id> // 消息唯一标识(可选)
retry: <reconnect-ms> // 断线重连时间(可选)
示例:
event: status
data: {"user": "Alice", "status": "online"}
data: This is a message
data: with multiple lines.
id: 123
retry: 5000
SSE 工作原理
客户端建立连接
浏览器通过EventSourceAPI 向服务器发起请求:const eventSource = new EventSource("/sse-endpoint");服务器保持连接
服务器响应 HTTP 头Content-Type: text/event-stream,并保持连接打开:HTTP/1.1 200 OK Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive服务器推送数据
服务器通过流式响应(Streaming Response)持续发送符合 SSE 格式的数据块:// Spring 中使用 SseEmitter 的示例 public SseEmitter streamEvents() { SseEmitter emitter = new SseEmitter(); for (int i = 0; i < 10; i++) { emitter.send(SseEmitter.event() .data("Event " + i + " @ " + new Date())); } }客户端处理数据
客户端监听事件并更新界面:eventSource.addEventListener("update", (event) => { console.log("Received:", event.data); });
SSE 的优缺点
优点 | 缺点 |
|---|---|
简单易用,基于 HTTP,无需复杂协议 | 仅支持单向通信(服务器到客户端) |
自动重连机制(客户端自动处理断线) | 部分旧浏览器不支持(IE、早期移动端) |
天然支持文本数据(如 JSON、日志) | 默认不支持二进制数据(需编码为文本) |
轻量级,适合高频低延迟场景 | 长连接可能受代理或防火墙限制 |
SSE vs. WebSocket vs. 轮询
技术 | 通信方向 | 协议 | 复杂度 | 适用场景 |
|---|---|---|---|---|
SSE | 单向(服务端→客户端) | HTTP | 低 | 实时通知、数据流(如日志) |
WebSocket | 双向 | WebSocket | 高 | 聊天、实时协作、游戏 |
轮询(Polling) | 客户端主动请求 | HTTP | 低 | 低频更新(兼容性要求高) |
SSE 应用场景
- 实时通知
- 数据流传输
- 进度反馈
- 动态内容更新
代码示例(Spring Boot)
服务端(Java)
public class SseController {
private final ExecutorService executor = Executors.newCachedThreadPool();
public SseEmitter streamData() {
SseEmitter emitter = new SseEmitter();
for (int i = 1; i <= 5; i++) {
emitter.send(SseEmitter.event()
.data("Progress: " + i * 20 + "%"));
}
emitter.completeWithError(e);
}
}
客户端(JavaScript)
const eventSource = new EventSource('http://localhost:8080/stream');
eventSource.onmessage = (e) => {
console.log('Message:', e.data);
};
eventSource.addEventListener('progress', (e) => {
document.getElementById('progress').innerText = e.data;
});
注意事项
- 跨域问题
- 需配置 CORS(如 Spring Boot 的
@CrossOrigin)。
- 连接管理
- 客户端需手动关闭连接:
eventSource.close()。
- 错误处理
- 性能优化
总结
SSE 是实现服务器到客户端实时单向通信的高效方案,适合需要轻量级、易集成的场景(如通知、数据流)。在 Spring 中可通过 SseEmitter 快速实现,结合前端 EventSource 完成实时交互。
热门推荐
久坐族健康预警:颈椎病等四大职业病防治全攻略
告别加班从时间管理开始:职场效率提升全攻略
70%职场人受心理健康困扰,企业多措并举构建关怀体系
职场进阶指南:如何通过沟通和借力实现职业突破
职场沟通这样做:赢得老板认可,与同事相处融洽
告别心理亚健康,从积极沟通开始
隆昌市教育和体育局教你掌握健康沟通技巧
职场成功秘籍:健康积极交流方式
番茄工作法:25分钟工作法提升企业生产力25%
番茄工作法提升职场沟通效率:25分钟工作+5分钟休息
女神也能入药,试看“绛珠仙子”如何治病救人!
告别“Awesome123”:教你设置一个有个性的ID
荔浦芋头扣肉,创意料理新花样
芋头与慢性肾炎:营养价值与食用注意事项
芋头养生大揭秘:这些禁忌你知道吗?
芋头:增强免疫力和促进消化的秘密武器
雷帕霉素延长小鼠寿命20%,抗衰老药物研究迎来重大突破
延长寿命15%-20%,雷帕霉素带来抗衰老新希望
最新研究揭示雷帕霉素新潜力,或成抗癌抗衰新利器
王者荣耀兰陵王新手出装攻略:破军暗影战斧必选
上海市第八人民医院推荐:非药物预防病毒感染
慈溪美食打卡攻略:牛肉虾仁拌面、鸭煲、羊骨头粥
探寻慈溪名菜:干菜龙山泥螺的前世今生
北京两座城门的双面魅力:宣武门重传统,崇文门显现代
麻省理工学院本科申请详解:从学术成绩到领导力培养
低温生长单晶薄膜,MIT三星合作攻克3D芯片制造难题
麻省理工学院蝉联全球第一,科技创新与人才培养双轮驱动
曙光英雄法修新手出装指南:从入门到精通
曙光英雄法修最强出装攻略:攻速暴击流打造远程输出之王
曙光英雄法修出装优化指南:从核心装备到星盘搭配