当前位置: 首页 > news >正文

SSE (Server-Sent Events) 技术简介

一、SSE 技术概述

Server-Sent Events (SSE) 是一种允许服务器向客户端实时推送数据的 Web 技术,它基于 HTTP 协议实现服务器到客户端的单向通信。
基本特点
● 单向通信:仅服务器→客户端方向
● 基于HTTP:使用标准HTTP协议,无需特殊协议
● 文本格式:默认传输UTF-8编码的文本数据
● 自动重连:内置连接中断恢复机制
● 轻量级:相比WebSocket更简单轻量

二、技术原理

1. 通信机制

SSE 通过长连接机制工作:

  1. 客户端建立常规HTTP连接
  2. 服务器保持连接打开 (Connection: keep-alive)
  3. 服务器通过此连接持续发送事件流
  4. 连接中断后客户端自动尝试重新连接

2. 协议细节

● Content-Type:text/event-stream
● Cache-Control:no-cache
● 编码:UTF-8

三、SSE 与相关技术对比

特性SSEWebSocketLong Polling
通信方向单向(服务器→客户端)双向半双工
协议基础HTTP独立协议HTTP
连接复杂度简单中等简单
断线重连自动需手动实现需手动实现
数据传输格式文本二进制/文本文本

四、SSE 技术实现

1. 客户端实现(@microsoft/fetch-event-source)

客户端建议使用@microsoft/fetch-event-source第三方封装库实现。

fetchEventSource('http://localhost:3000/sse', {method: 'GET',headers: {'Content-Type': 'application/json; charset=utf-8','Accept': 'text/event-stream',// 跨域'Access-Control-Allow-Origin': '*',},onopen(response) {},onmessage(msg) {},onerror(err) {},onclose(res) {},openWhenHidden: true,
});

2. 服务端实现 (Express.js示例)

router.get('/', async function(req, res) {const str = 'hello word!'// 设置 SSE 相关的响应头res.setHeader('Content-Type', 'text/event-stream;charset=utf-8');res.setHeader('Cache-Control', 'no-cache');res.setHeader('Connection', 'keep-alive');res.flushHeaders();let count = 30;const interval = setInterval(() => {count++const message = {time: new Date().toISOString(),content: "有新消息了",code: 0,count: count};res.write(`data: ${JSON.stringify(message)}\n\n`); // 必须有两个\n}, 5000);req.on('close', () => {clearInterval(interval);});
});

五、SSE 消息格式详解

1. 基本字段

data:消息内容(必选)

data: message content\n\n

event:事件类型(可选)

event: customEvent\ndata: {"key":"value"}\n\n

id:事件ID(用于断线重连)

id: 12345\ndata: message\n\n

retry:重连时间(毫秒)

retry: 5000\n\n

六、SSE 高级特性

1. 安全机制

● CORS 支持:同其他HTTP请求一样遵循同源策略
● 认证:可使用Cookie或Authorization头
● HTTPS:生产环境应始终使用加密连接

2. 性能优化

● 压缩:支持gzip/deflate压缩
● 连接复用:HTTP/2下效果更佳
● 缓存控制:合理设置缓存头

3. 扩展应用

● 二进制数据:Base64编码传输
● 组合使用:与REST API配合使用

七、SSE 适用场景

1. 实时通知系统

○ 社交网络更新
○ 系统告警通知

2. 实时数据监控

○ 股票价格变动
○ IoT设备数据流

3. 新闻/体育赛事直播

○ 比分实时更新
○ 新闻快讯推送

4. 进度报告

○ 长时间操作进度
○ 文件处理状态

相关文章:

  • 校园网背后的技术:如何实现全校覆盖与无缝漫游?
  • Go 语言中的内置运算符
  • vue中Echarts的使用
  • VSCode主题设计大赛
  • LeetCode 1723: 完成所有工作的最短时间
  • OpenEuler 系统中 WordPress 部署深度指南
  • Fork/Join框架:CountedCompleter与RecursiveTask深度对比
  • C语言 — 通讯录模拟实现
  • 135. 分发糖果
  • 2.1.1 通信基础的基本概念
  • F(x,y)= 0 隐函数 微分法
  • sizeof 与strlen的区别
  • 基于规则的自然语言处理
  • 进程与线程的区别
  • 5-C#的DateTime使用
  • 2025.6.8
  • java 时区时间转为UTC
  • 一种停车场自动停车导航器的设计(论文+源码)
  • 31.2linux中Regmap的API驱动icm20608实验(编程)_csdn
  • 【存储基础】对象存储基础知识
  • 飞浪网站建设/上百度推广的网站要多少钱
  • 乐亭网站建设/雅思培训机构哪家好机构排名
  • 网站建设及推广服务的合同范本/老客外链
  • 保险代理人做网站/中国新闻网
  • 直播网站开发框架/专门看广告的网站
  • 网站后台看不到部分内容/正规百度推广