[字节青训_AI对话框]SSE交互规范、自定义事件、前后端数据传递、状态监听、连接和断开详解

devtools/2025/2/26 20:50:08/

1.SSE基础

以下是关于 Server-Sent Events (SSE) 的前后端交互规范、常见方法及自定义扩展的完整指南:


一、SSE 交互规范

1. 基础协议
  • HTTP 协议:基于 HTTP/1.1 长连接,响应头需包含:
  Content-Type: text/event-streamCache-Control: no-cacheConnection: keep-alive
2. 数据格式规范

每条消息格式为:

[field]: value\n

支持字段:

  • data:消息内容(必填)
  • event:自定义事件类型(默认 message
  • id:消息ID(用于断线重连定位)
  • retry:重连时间(毫秒)

示例:标准数据流

event: status
{"progress": 75%}This is a message\n
with two linesid: 12345
retry: 5000

二、常见方法

1. 前端基础用法
const es = new EventSource('/api/stream');// 监听默认事件
es.onmessage = ({ data }) => console.log('Received:', data);// 监听自定义事件
es.addEventListener('update', ({ data }) => {console.log('Update:', JSON.parse(data));
});// 错误处理
es.onerror = () => console.error('Connection lost');
2. 后端基础实现(Node.js)
app.get('/api/stream', (req, res) => {res.writeHead(200, {'Content-Type': 'text/event-stream','Access-Control-Allow-Origin': '*' // 处理跨域});// 发送初始数据res.write('Connected\n\n');// 定时推送数据const timer = setInterval(() => {res.write(`${Date.now()}\n\n`);}, 1000);// 客户端断开时清理req.on('close', () => clearInterval(timer));
});

三、自定义扩展方法

1. 身份验证
  • 前端:通过 URL 参数或 Cookie 传递 Token
  new EventSource('/api/stream?token=xxxx')
  • 后端:验证 Token 有效性
  app.get('/api/stream', (req, res) => {if (!validateToken(req.query.token)) {res.writeHead(401).end();return;}// ...后续推送逻辑});
2. 结构化数据传递

使用 JSON 编码:

// 前端解析
es.onmessage = ({ data }) => {const msg = JSON.parse(data);console.log(msg.type, msg.content);
};// 后端发送
res.write(`data:${JSON.stringify({ type: 'alert', content: 'Warning' })}\n\n`);
3. 分块传输大文本(流式数据处理)
// 后端分块发送
const bigText = "Very long text...";
for (const chunk of chunkText(bigText, 100)) { // 每100字符分块res.write(`event: chunk\n${chunk}\n\n`);
}// 前端组装
let fullText = '';
es.addEventListener('chunk', ({ data }) => {fullText += data;
});
4. 双向通信模拟

SSE 是单向通道,但可通过以下方式模拟双向:

// 前端通过 AJAX 发送控制命令
function sendCommand(cmd) {fetch('/api/control', { method: 'POST', body: cmd });
}// 后端响应命令并推送结果
app.post('/api/control', (req, res) => {handleCommand(req.body, (result) => {sseClients.forEach(client => client.res.write(`event: command-result\n${result}\n\n`));});res.status(200).end();
});

四、高级实践

1. 性能优化
  • 压缩数据:启用 gzip 压缩
  app.use(compression()); // Express 中间件
  • 心跳检测:防止代理超时(核心,面试!!!
  setInterval(() => res.write(': ping\n\n'), 30000);
3. 错误恢复

重连,简历

let es = null;function connectSSE() {es = new EventSource('/api/stream');es.onerror = () => {es.close();setTimeout(connectSSE, 5000); // 5秒后重连};
}connectSSE(); // 初始连接

五、注意事项

  1. 跨域问题
    确保响应头包含 Access-Control-Allow-Origin,或通过代理解决。

  2. 连接限制
    浏览器对单个域名 SSE 连接数有限制(通常 6 个),需合理设计连接复用。

  3. 数据安全
    敏感数据需加密或通过 HTTPS 传输。

  4. 兼容性
    SSE 不支持 IE,需使用 Polyfill(如 eventsource 库)。


通过上述规范和扩展方法,SSE 可灵活应用于实时监控、消息推送、日志流等场景。开发者应根据具体需求选择合适的数据格式和通信模式。

2.前端SSE类封装

//EventSourceWrapper.js
type EventSourceConfig = {url: string;queryParams?: Record<string, string>;onMessage: (string) => void; // 直接传递数据onError?: (error: Error) => void;
};export class EventSourceWrapper {private eventSource: EventSource | null = null;constructor(private 

http://www.ppmy.cn/devtools/162882.html

相关文章

跟着李沐老师学习深度学习(十四)

注意力机制&#xff08;Attention&#xff09; 引入 心理学角度 动物需要在复杂环境下有效关注值得注意的点心理学框架&#xff1a;人类根据随意线索和不随意线索选择注意力 注意力机制 之前所涉及到的卷积、全连接、池化层都只考虑不随意线索而注意力机制则显示的考虑随意…

Windows Server 搭建 RADIUS 认证服务器

Windows Server 搭建 RADIUS 认证服务器 1.搭建 AD CS 证书服务器 2.配置 Active Directory 证书服务 3.搭建 NPS 认证服务器 4.为 NPS 服务器申请证书 5.配置 RADIUS 服务搭建 AD CS 证书服务器 1、打开「服务器管理器」&#xff0c;选择右上角的「管理」>「添加角色和功能…

springboot实现多文件上传

springboot实现多文件上传 代码 package com.sh.system.controller;import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMap…

计算机毕业设计SpringBoot+Vue.js购物推荐系统网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

硬件工程师入门教程

1.欧姆定律 测电压并联使用万用表测电流串联使用万用表&#xff0c;红入黑出 2.电阻的阻值识别 直插电阻 贴片电阻 3.电阻的功率 4.电阻的限流作用 限流电阻阻值的计算 单位换算关系 5.电阻的分流功能 6.电阻的分压功能 7.电容 电容简单来说是两块不连通的导体加上中间的绝…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Spring Boot中如何使用Thymeleaf模板引擎

Thymeleaf 是一个现代化的服务器端 Java 模板引擎,在 Spring Boot 项目中使用它可以方便地将 Java 代码和 HTML 页面进行整合,生成动态的 Web 页面。以下将详细介绍在 Spring Boot 中如何使用 Thymeleaf 模板引擎。 1. 添加依赖 如果你使用的是 Maven 项目,在 pom.xml 中添…

C# 封装

C# 封装 引言 封装(Encapsulation)是面向对象编程(OOP)中的一个核心概念,它指的是将对象的属性(数据)和操作(函数)捆绑在一起,形成独立的单元,从而隐藏对象的内部细节,只提供公共接口供外部访问。在C#中,封装是实现信息隐藏和数据保护的一种有效手段,可以提高代…