Skip to content

SSE 服务器推送技术

SSE协议(Server-Sent Events)是一种基于HTTP的服务器推送技术,主要用于实现服务器向客户端的单向、持续数据流传输。

用途

1. 实时数据推送

适用于股票行情更新、新闻推送、社交媒体通知等需要服务器主动推送数据的场景‌。 例如,服务器可实时将最新股价或新闻推送给客户端,无需客户端轮询。

2. 大模型交互

在AI对话平台(如ChatGPT)中,SSE用于实时传输模型生成的文本,实现流畅的对话体验‌

3. 文件处理与进度反馈

支持文件上传/下载进度的实时更新,如进度条动态显示‌

SSE 与 WebSocket 对比

  • SSE仅支持服务器到客户端的单向通信,适合无需客户端回传数据的场景‌
  • 与WebSocket相比,SSE更简单
  • 基于标准HTTP协议,轻量且易实现‌

客户端代码

1.基础api

  • EventSource对象:用于创建SSE连接,监听服务器发送的事件。

  • onmessage事件:当服务器发送消息时触发,可在事件处理函数中处理消息数据。每个消息包含以下属性:

    • data:服务器发送的消息数据(字符串格式)
    • event:事件类型(可选,默认值为message
    • id:消息 ID(可选,用于标识消息,服务器可在后续消息中引用该 ID)
    • retry:重连时间(可选,单位:毫秒,用于指定客户端在连接中断后重新连接的时间间隔)

2.代码

javascript
const eventSource = new EventSource('http://localhost:3000/sse-endpoint');

eventSource.onmessage = (event) => {
  event
  console.log('收到服务器消息:', event.data);
};

服务端代码

nodejs 代码

javascript
const express = require('express');
const app = express();

app.get('/sse-endpoint', (req, res) => {
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');

  let counter = 0;
  const interval = setInterval(() => {
    counter++;
    res.write(`data: ${counter}\n\n`);
  }, 1000);

  req.on('close', () => {
    clearInterval(interval);
    res.end();
  });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

京ICP备2024093538号-1