什么事SSE& SSE vs websocket

SSE(Server-Sent Events,服务器推送事件) 是一种基于 HTTP 的轻量级协议,允许服务器主动向客户端(如浏览器)推送实时数据。它是 HTML5 标准的一部分,适用于需要服务器单向实时通信的场景(例如新闻推送、股票行情、实时日志等)。

SSE 核心机制

1. 通信模式
  • 单向性 :仅支持服务器到客户端的单向通信(客户端无法通过 SSE 向服务器发送数据)。
  • 长连接:客户端通过一次 HTTP 请求建立连接,服务器保持连接打开状态,持续发送数据流。
2. 协议特性
  • 基于 HTTP:使用标准 HTTP 协议,无需额外协议支持(如 WebSocket)。
  • 文本格式:数据以纯文本形式传输(支持 UTF-8 编码),格式灵活。
  • 事件驱动 :数据可附带自定义事件名称(如 messageupdate),客户端可监听特定事件。
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 工作原理

  1. 客户端建立连接

    浏览器通过 EventSource API 向服务器发起请求:

    const eventSource = new EventSource("/sse-endpoint");

  2. 服务器保持连接

    服务器响应 HTTP 头 Content-Type: text/event-stream,并保持连接打开:

    HTTP/1.1 200 OK Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive

  3. 服务器推送数据

    服务器通过流式响应(Streaming Response)持续发送符合 SSE 格式的数据块:

    复制代码
    java 复制代码
    // Spring 中使用 SseEmitter 的示例
    @GetMapping("/sse-endpoint")
    public SseEmitter streamEvents() {
        SseEmitter emitter = new SseEmitter();
        executor.execute(() -> {
            for (int i = 0; i < 10; i++) {
                emitter.send(SseEmitter.event()
                    .name("update")
                    .data("Event " + i + " @ " + new Date()));
                Thread.sleep(1000);
            }
            emitter.complete();
        });
        return emitter;
    }
  4. 客户端处理数据

    客户端监听事件并更新界面:

    复制代码
    javascript 复制代码
    eventSource.addEventListener("update", (event) => {
        console.log("Received:", event.data);
    });

SSE 的优缺点

优点 缺点
简单易用,基于 HTTP,无需复杂协议 仅支持单向通信(服务器到客户端)
自动重连机制(客户端自动处理断线) 部分旧浏览器不支持(IE、早期移动端)
天然支持文本数据(如 JSON、日志) 默认不支持二进制数据(需编码为文本)
轻量级,适合高频低延迟场景 长连接可能受代理或防火墙限制

SSE vs. WebSocket vs. 轮询

技术 通信方向 协议 复杂度 适用场景
SSE 单向(服务端→客户端) HTTP 实时通知、数据流(如日志)
WebSocket 双向 WebSocket 聊天、实时协作、游戏
轮询(Polling) 客户端主动请求 HTTP 低频更新(兼容性要求高)

SSE 应用场景

  1. 实时通知
    • 用户消息提醒、系统报警。
  2. 数据流传输
    • 实时日志、股票行情、新闻推送。
  3. 进度反馈
    • 文件上传/下载进度、长时间任务状态更新。
  4. 动态内容更新
    • 实时评论、投票结果、在线用户列表。

代码示例(Spring Boot)

服务端(Java)
复制代码
java 复制代码
@RestController
public class SseController {
    private final ExecutorService executor = Executors.newCachedThreadPool();

    @GetMapping("/stream")
    public SseEmitter streamData() {
        SseEmitter emitter = new SseEmitter();
        executor.execute(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    emitter.send(SseEmitter.event()
                        .name("progress")
                        .data("Progress: " + i * 20 + "%"));
                    Thread.sleep(1000);
                }
                emitter.complete();
            } catch (Exception e) {
                emitter.completeWithError(e);
            }
        });
        return emitter;
    }
}
客户端(JavaScript)
复制代码
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;
});

注意事项

  1. 跨域问题
    • 需配置 CORS(如 Spring Boot 的 @CrossOrigin)。
  2. 连接管理
    • 客户端需手动关闭连接:eventSource.close()
  3. 错误处理
    • 监听 error 事件处理网络中断或服务器错误。
  4. 性能优化
    • 控制推送频率,避免服务器资源耗尽。

总结 :SSE 是实现服务器到客户端实时单向通信的高效方案,适合需要轻量级、易集成的场景(如通知、数据流)。在 Spring 中可通过 SseEmitter 快速实现,结合前端 EventSource 完成实时交互。

相关推荐
南湖北漠4 分钟前
浅谈生活中的规范化品牌代理标准店和精简标准代理店 时间:2026年3月30日(来源网络,原创)
网络·人工智能·计算机网络·其他·生活
通信瓦工12 分钟前
IEC 61975-2022标准介绍
大数据·网络
OneMoreThink25 分钟前
攻击路径(13):借助集权系统,从金融办公网打到业务区
网络·金融
高工智能汽车35 分钟前
从“有网”到“智驾级可靠”,云动智能如何筑牢L3时代「数字底座」?
网络
有代理ip40 分钟前
聚焦性价比:便宜动态IP在网络优化中的应用技巧
网络·网络协议·tcp/ip
wanhengidc1 小时前
云手机 流畅稳定 操作简单
服务器·网络·网络协议·安全·智能手机
码农爱学习1 小时前
使用cJosn读写配置文件
java·linux·网络
zl_dfq1 小时前
计算机网络 之 【https协议】(数字摘要、密钥、数字证书)
网络协议·计算机网络·https
智象科技1 小时前
告警自动化赋能运维:意义与价值解析
网络·数据库·人工智能·自动化·告警·一体化运维·ai运维
北京耐用通信1 小时前
工业协议转换新选择:耐达讯自动化CC-Link I转EtherCAT网关深度解析
人工智能·科技·物联网·网络协议·自动化·信息与通信