服务端推送 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 协议,兼容性好
  • 自动重连机制提高可靠性

适用场景:

  • 实时数据更新
  • 消息通知
  • 日志流式处理
相关推荐
hrrrrb4 小时前
【Spring Boot 快速入门】八、登录认证(一)基础登录与认证校验
spring boot·后端
王大锤·4 小时前
基于spring boot的个人博客系统
java·spring boot·后端
bobz9655 小时前
QT designer 常用技巧
后端
shi57835 小时前
C# 常用的线程同步方式
开发语言·后端·c#
没逻辑5 小时前
抗量子密码技术(PQC)演变
后端·量子计算
day>day>up6 小时前
django uwsgi启动报错failed to get the Python codec of the filesystem encoding
后端·python·django
Livingbody6 小时前
FastMCP In Action跑通第一个MCP之跟学python版
后端
bobz9656 小时前
QT 中的三种基本UI类型:Main Window | Widget | Dialog
后端
zhoupenghui1686 小时前
golang实现支持100万个并发连接(例如,HTTP长连接或WebSocket连接)系统架构设计详解
开发语言·后端·websocket·golang·系统架构·echo·100万并发
咸甜适中7 小时前
Rust语言序列化和反序列化vec<u8>,serde库Serialize, Deserialize,bincode库(2025年最新解决方案详细使用)
开发语言·后端·rust