news 2026/4/24 23:26:48

SSE 流式响应(Server-Sent Events)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSE 流式响应(Server-Sent Events)

SSE 流式响应(Server-Sent Events)是一种基于 HTTP 协议、服务器主动向客户端单向推送数据流的实时通信技术,核心是长连接 + 分块传输,让数据像水流一样源源不断推到前端,不用等全部生成完再返回。

AI 大模型回答需要边生成边输出(流式),SSE 完美匹配:

  • 纯文本流、单向推送
  • 浏览器原生支持、无依赖
  • 部署简单、兼容所有后端 / 云服务
  • 比长轮询延迟低、比 WebSocket 轻量

核心特点

  • 单向流:只能服务器 → 客户端推送
  • HTTP 原生:不用升级协议、不用 WebSocket 握手
  • 自动重连:断网后浏览器自动重试(默认 3 秒)
  • 文本流text/event-stream格式,UTF-8 文本
  • 轻量简单:比 WebSocket 更轻、更易部署

SSE vs WebSocket(关键区别)

特性SSEWebSocket
方向单向(服务→客户端)双向全双工
协议HTTP独立 WebSocket 协议
重连浏览器自动需自己实现
复杂度极低较高
跨域支持 CORS需额外配置
适用单向流、AI、日志聊天室、游戏、强交互

SSE 完整示例

npm install express

新建:server.js

const express = require('express'); const app = express(); // 允许跨域(方便前端单独开页面调用) app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', '*'); next(); }); // SSE 接口 app.get('/api/sse', (req, res) => { // SSE 必须的响应头 res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 解决 nginx 反向代理时缓冲问题 res.setHeader('X-Accel-Buffering', 'no'); // 模拟逐字输出:每隔 300ms 发一段 const text = '大家好,这是一段 SSE 流式响应,逐字推送给你~'; let index = 0; const timer = setInterval(() => { if (index >= text.length) { // 结束标志 res.write(`data: [DONE]\n\n`); clearInterval(timer); res.end(); return; } const char = text[index++]; // SSE 格式必须:data:xxx\n\n res.write(`data: ${char}\n\n`); }, 300); // 客户端断开连接 req.on('close', () => { clearInterval(timer); }); }); app.listen(3000, () => { console.log('SSE 服务已启动:http://localhost:3000'); });

启动: node server.js

idnex.vue:

<template> <div class="sse-container" style="padding: 20px;"> <h3>SSE 流式响应(Vue2 版)</h3> <!-- 按钮控制 --> <div style="margin-bottom: 15px;"> <button @click="startSSE" :disabled="isConnecting" style="padding: 6px 12px; margin-right: 10px;" > {{ isConnecting ? '连接中...' : '开始接收流式数据' }} </button> <button @click="closeSSE" style="padding: 6px 12px;" > 关闭连接 </button> </div> <!-- 流式内容展示区 --> <div class="content" style=" border: 1px solid #eee; padding: 15px; min-height: 200px; white-space: pre-wrap; font-size: 16px; line-height: 1.6; " > {{ result }} </div> </div> </template> <script> export default { name: "SseDemo", data() { return { result: "", // 接收的流式内容 isConnecting: false, // 是否正在连接 eventSource: null, // SSE 实例 }; }, methods: { // 启动 SSE 连接 startSSE() { // 避免重复连接 if (this.eventSource) return; this.result = ""; this.isConnecting = true; // 创建 SSE 连接(后端地址) const es = new EventSource("http://localhost:3000/api/sse"); this.eventSource = es; // 连接成功 es.onopen = () => { console.log("✅ SSE 连接成功"); }; // 接收服务器推送的消息 es.onmessage = (e) => { const data = e.data; // 收到结束标记 if (data === "[DONE]") { this.result += "\n\n✅ 推送完成!"; this.closeSSE(); return; } // 追加内容(打字机效果) this.result += data; }; // 错误处理 es.onerror = (err) => { console.error("❌ SSE 错误:", err); this.result += "\n❌ 连接异常断开"; this.closeSSE(); }; }, // 关闭 SSE 连接 closeSSE() { if (this.eventSource) { this.eventSource.close(); this.eventSource = null; } this.isConnecting = false; console.log("🔌 SSE 连接已关闭"); }, }, // 页面销毁时自动关闭连接 beforeDestroy() { this.closeSSE(); }, }; </script>

实现效果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 23:26:46

Linux--Android ADB工具使用

adb shell 本质是通过 ADB 协议在主机和设备之间建立一个 “远程 shell 通道”&#xff0c;你在主机终端输入的命令会被发送到设备端执行&#xff0c;执行结果再返回给主机显示。这和通过 SSH 登录远程 Linux 服务器的体验类似&#xff0c;相当于**“远程操控设备的终端”**。 …

作者头像 李华
网站建设 2026/4/24 23:25:57

异环倾陷破防输出技巧 异环倾陷破防输出攻略

想在异环中打出碾压级伤害&#xff0c;核心就是吃透异环倾陷破防输出技巧&#xff0c;它是贯穿所有战斗的核心增伤逻辑&#xff0c;从日常清怪到高难BOSS战都离不开这套机制。掌握异环倾陷破防输出技巧&#xff0c;能让你快速叠满敌人倾陷值触发瘫痪破防&#xff0c;在窗口期倾…

作者头像 李华
网站建设 2026/4/24 23:21:21

Zotero-Style插件标签显示问题完整修复指南:让文献标签重回视线

Zotero-Style插件标签显示问题完整修复指南&#xff1a;让文献标签重回视线 【免费下载链接】zotero-style Ethereal Style for Zotero 项目地址: https://gitcode.com/GitHub_Trending/zo/zotero-style Zotero-Style插件为学术文献管理带来了革命性的视觉体验&#xff…

作者头像 李华