服务端推送 SSE

1. SSE 的背景

Server-Sent Events (SSE) 是一种服务器推送技术,允许服务器向客户端实时推送数据。在以下场景特别有用:

  • 实时数据更新(如股票价格、天气信息)
  • 社交媒体信息流
  • 实时日志显示
  • 进度通知

2. SSE 的本质

SSE 本质上是基于 HTTP 协议的单向通信机制:

  • 使用 HTTP 长连接实现服务器到客户端的单向数据流
  • 数据格式为纯文本,编码必须是 UTF-8
  • 基于标准 HTTP 协议,无需特殊协议支持

3. SSE 的特点

  1. 单向通信:服务器到客户端的单向数据流
  2. 自动重连:断开后默认自动重连
  3. 简单易用:使用标准 HTTP,无需 WebSocket 的复杂配置
  4. 支持自定义事件
  5. 天然支持跨域(CORS)

4. SSE 客户端 API

基本使用示例:

javascript 复制代码
const evtSource = new EventSource('/events');

// 监听消息
evtSource.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log(data);
};

// 监听连接打开
evtSource.onopen = function() {
    console.log('连接已建立');
};

// 监听错误
evtSource.onerror = function(err) {
    console.error('发生错误:', err);
};

// 监听自定义事件
evtSource.addEventListener('custom-event', function(e) {
    console.log('自定义事件:', e.data);
});

// 关闭连接
// evtSource.close();

5. SSE 服务端实现

数据格式

服务器发送的数据必须遵循特定格式:

  • 每条消息以 data: 开头
  • 每条消息以 \n\n 结尾
  • 支持多个字段:data、event、id、retry

data 字段

kotlin 复制代码
data: 消息内容\n\n

多行数据:

kotlin 复制代码
data: 第一行\n
data: 第二行\n\n

id 字段

用于消息标识,断线重连时会发送 Last-Event-ID 头:

makefile 复制代码
id: 1\n
data: 消息内容\n\n

event 字段

用于指定事件类型:

vbnet 复制代码
event: custom-event\n
data: 消息内容\n\n

retry 字段

指定重连时间(毫秒):

makefile 复制代码
retry: 10000\n
data: 消息内容\n\n

6. Node 服务器实例

javascript 复制代码
const express = require('express');
const app = express();

app.get('/events', (req, res) => {
    // 设置 SSE 所需的 headers
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });

    // 发送初始数据
    res.write('data: 连接已建立\n\n');

    // 定时发送数据
    const intervalId = setInterval(() => {
        const data = {
            time: new Date().toISOString(),
            value: Math.random()
        };
        
        res.write(`data: ${JSON.stringify(data)}\n\n`);
    }, 1000);

    // 监听连接关闭
    req.on('close', () => {
        clearInterval(intervalId);
    });
});

app.listen(3000, () => {
    console.log('SSE 服务器运行在 3000 端口');
});

注意事项

  1. 格式有特定要求:开头为 data:、结尾为 \n\n
  2. 每个浏览器的并发 SSE 连接数有限制
  3. 某些代理服务器可能不支持长连接
  4. 建议实现错误重试机制
  5. 大规模使用时注意服务器资源管理

总结

SSE 是一个简单但强大的服务器推送方案:

  • 相比 WebSocket 更轻量,实现更简单
  • 单向通信满足大多数推送场景
  • 基于 HTTP 协议,兼容性好
  • 自动重连机制提高可靠性

适用场景:

  • 实时数据更新
  • 消息通知
  • 日志流式处理
相关推荐
爬山算法13 分钟前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy30 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇36 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long3161 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_1111 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日1 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu2 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人3 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法3 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
独断万古他化3 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring