SSE 流式接口讲解

SSE 流式接口

1. 一句话定义

SSE = Server-Sent Events,服务器主动向浏览器推送数据流的技术

  • 只用于:服务器 → 客户端 单向推送
  • 典型场景:AI 打字机效果、实时通知、日志滚动、直播弹幕
  • 你看到的豆包/DeepSeek/ChatGPT 回复,全都是 SSE

2. 核心特点(必须记住)

基于 HTTP ,不需要 WebSocket

服务器主动推流 ,前端自动接收

天然支持断线重连

非常适合文本流、AI 流式输出

❌ 只能服务器→客户端 ,不能双向

❌ 不适合超低延迟游戏(用 WS)


3. 前端怎么用?(代码直接复制)

前端接收 SSE 流(最简版)

javascript 复制代码
// 1. 创建 SSE 连接
const evtSource = new EventSource('/api/stream');

// 2. 接收消息(核心)
evtSource.onmessage = (e) => {
  const data = e.data; 
  console.log('收到流数据:', data);
  // AI 场景:直接把数据追加到页面 → 打字机效果
  document.body.innerHTML += data;
};

// 3. 错误处理
evtSource.onerror = (err) => {
  console.error('SSE 出错', err);
  evtSource.close(); // 关闭连接
};

// 4. 手动关闭
// evtSource.close()

4. 服务器返回格式(必须严格遵守!)

SSE 不是随便返回的,格式是固定协议

复制代码
data: 你好\n\n
data: 我是\n\n
data: AI\n\n

规则:

  • 每一段必须以 data: 开头
  • 必须以 两个换行 \n\n 结束
  • 只能传字符串(JSON 要转字符串)

如果返回 JSON:

复制代码
data: {"content":"你好"}\n\n

5. 最常用场景:AI 流式输出(打字机效果)

前端代码(完整版)

javascript 复制代码
const sse = new EventSource('/api/ai-chat');
let result = '';

sse.onmessage = (e) => {
  try {
    const data = JSON.parse(e.data);
    result += data.content; // 追加文字
    renderToUI(result); // 实时渲染到页面
  } catch (err) {}
};

// 结束标识
sse.addEventListener('close', () => {
  sse.close();
});

服务器返回流示例

复制代码
data: {"content":"大"}

data: {"content":"家"}

data: {"content":"好"}

data: {"content":"!"}

data: "[DONE]"

6. SSE 关键请求头(面试/抓包必考)

你在浏览器看到的:

复制代码
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

这三个就是 SSE 标志


7. SSE vs WebSocket(最简单对比)

特性 SSE WebSocket
方向 服务器 → 客户端 双向
协议 HTTP WS 独立协议
复杂度 极低 较高
断线重连 自动 手动
适用场景 AI流、通知、日志 聊天、游戏、实时协作

结论:AI 流式回答 → 永远选 SSE


8. 你之前的截图是什么?

就是 SSE 接口

  • Content-Type: text/event-stream
  • 服务器不断推流
  • 前端一段一段接收 → 拼成最终回答

9. 超简总结(背会就能面试/开发)

  1. SSE = 服务器推流技术
  2. 用于 AI 打字机、实时日志
  3. 前端用 new EventSource(url) 接收
  4. 服务器返回 data: xxx\n\n 格式
  5. 只进不出,简单稳定
相关推荐
随风一样自由9 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
YHHLAI10 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
weixin_BYSJ198710 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
沪飘大军11 小时前
ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理
javascript
山河木马13 小时前
GPU自动处理专题3-NDC怎么映射成屏幕像素坐标(视口变换)
javascript·webgl·图形学
Appthing14 小时前
在 TanStack Start 中使用 VitePWA 的正确配置
javascript
前端炒粉15 小时前
手写promise
java·前端·javascript
mONESY15 小时前
Node.js fs 文件系统模块 四种读写方案全解析
javascript·后端
Larcher15 小时前
从回调地狱到优雅异步:Node.js 文件操作进化史
javascript·后端·架构
熊猫钓鱼>_>16 小时前
Electron:当 Web 技术统治桌面
大数据·前端·javascript·人工智能·架构·electron·agent