什么是 SSE(服务器发送事件)?
为什么 ChatGPT 吐字打字机效果、股票行情盯盘都不用复杂的 WebSocket,而全选 SSE?用“单向广播收音机”看懂最优雅、最轻量的标准 HTTP 服务端流式推送!
🚪👦 疯狂敲门熊孩子
每隔 1 秒敲一次门问:“好了没?好了没?好了没?”。99% 的网络请求都是白跑一趟(空载),不仅巨消耗服务器带宽与电池,延迟还奇高。
📻📡 单向广播收音机
浏览器只要听,服务端一直播! 客户端只发送一次普通 HTTP 请求,连接保持打开,服务端像水龙头一样源源不断单向推送文本流。
📞🔄 24小时双向实时通话
专门升级为独立的 TCP 全双工通道。双方可以随时同时互相通话。非常强大,但在只需要服务器单向推送的场景下显得杀鸡用牛刀。
SSE 傲视群雄的三大核心绝技
极简主义哲学如何在大模型时代大放异彩
1. 纯正 HTTP 基因,零网络阻碍
不需要像 WebSocket 一样进行复杂的 Protocol Upgrade(协议升级握手)。它就是一条标准的 HTTP/1.1 或 HTTP/2 请求!企业内网防火墙、反向代理(Nginx、Cloudflare)100% 顺畅放行。
2. 浏览器原生内置,自带断线重连
JavaScript 提供了原生的 EventSource API。如果网络突然晃动闪退断开,浏览器会在后台默默自动发起重新连接,并带上上次接收到的 Last-Event-ID 自动续接,无需手写心跳重试逻辑!
3. 极简可读纯文本协议
数据格式极其通俗透明:仅仅是多行 data: xxx\n\n 纯文本。任何后端语言(Python、Go、Node.js)只需要往响应体里 print() 几行文字并刷新缓冲区(flush),开发成本几乎为零!
🔬 SSE 报文与浏览器调用实战解剖
仅需标准的 Content-Type 与极简的换行语法,即可驱动实时流式传输:
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
# 事件 1: 发送消息与 ID
id: 1
data: {"token": "人"}
# 事件 2: 紧接着吐出下一个词
id: 2
data: {"token": "工"}
# 双换行 \n\n 代表一个事件推送结束!
const source = new EventSource('/api/chat-stream');
// 2. 每当服务端吐出新 Token 时触发
source.onmessage = (event) => {
const payload = JSON.parse(event.data);
renderToScreen(payload.token);
};
// 3. 监听错误或关闭
source.onerror = () => {
console.log("流式输出结束或网络重连中...");
};
🎮 交互模拟器:亲身体验 SSE 实时流式打字过程
点击下方按钮,观察服务器如何通过 text/event-stream 数据块一个一个向前端推进文字: