SSE技术详解及应用场景

text/event-streamServer-Sent Events (SSE) 的 MIME 类型。这是一种基于 HTTP 的服务器向客户端推送实时数据的技术。

主要特点:

1. 单向通信

  • 服务器 → 客户端单向推送
  • 客户端使用 EventSource API 接收数据
  • 不同于 WebSocket 的双向通信

2. 工作原理

java 复制代码
// 服务器端(Spring Boot示例)
@PostMapping(value = "/question/answer/stream", 
             produces = "text/event-stream;charset=UTF-8")
public Flux<String> streamAnswer() {
    return Flux.interval(Duration.ofSeconds(1))
               .map(seq -> "data: 消息 " + seq + "\n\n");
}
javascript 复制代码
// 客户端(JavaScript)
const eventSource = new EventSource('/question/answer/stream');

eventSource.onmessage = (event) => {
    console.log('收到数据:', event.data);
};

eventSource.onerror = (error) => {
    console.error('连接错误:', error);
};

3. 数据格式规范

复制代码
data: 第一行数据\n
data: 第二行数据\n
\n
(空行表示一个消息结束)

data: 这是一条完整消息\n
\n

event: customEvent\n
data: 自定义事件数据\n
\n

4. 优势

  • 自动重连:连接中断会自动尝试重连
  • 简单易用:基于普通 HTTP,无需特殊协议
  • 轻量级:适合单向数据推送场景
  • 支持跨域:可以通过 CORS 配置

5. 典型应用场景

java 复制代码
// AI问答流式响应示例
@PostMapping(value = "/question/answer/stream", 
             produces = "text/event-stream;charset=UTF-8")
public Flux<String> streamAnswer(@RequestBody QuestionRequest request) {
    return aiService.generateStreamAnswer(request.getQuestion())
        .map(chunk -> "data: " + chunk + "\n\n");
}

// 返回的数据流会是:
// data: 这是\n
// data: 一段\n
// data: 流式\n
// data: 回答\n
// \n

6. 与 WebSocket 比较

特性 SSE WebSocket
协议 HTTP WS/WSS
方向 单向(服务器推) 双向
重连 自动 需手动实现
二进制数据 仅文本 支持二进制
复杂度 较高

7. 注意事项

  • 保持连接:需要服务器保持连接打开
  • 超时设置:可能需要调整服务器超时配置
  • 字符集:charset=UTF-8 确保中文正常显示
  • 浏览器兼容性:主流浏览器都支持(IE除外)

在 AI 问答场景中,SSE 非常适合用于实时流式返回生成的文本,让用户能够逐字看到答案生成过程,提升体验。

相关推荐
Memory_荒年17 小时前
TiDB:当 MySQL 遇上分布式,生了个“超级混血儿”
java·数据库·后端
asom2217 小时前
DDD(领域驱动设计) 核心概念详解
java·开发语言·数据库·spring boot
大傻^18 小时前
LangChain4j Spring Boot Starter:自动配置与声明式 Bean 管理
java·人工智能·spring boot·spring·langchain4j
沐硕18 小时前
《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》
java·python·算法·fastapi·多目标优化·饮食推荐·改进协同过滤
愣头不青18 小时前
560.和为k的子数组
java·数据结构
共享家952718 小时前
Java入门(String类)
java·开发语言
l软件定制开发工作室18 小时前
Spring开发系列教程(34)——打包Spring Boot应用
java·spring boot·后端·spring·springboot
0xDevNull19 小时前
Spring Boot 循环依赖解决方案完全指南
java·开发语言·spring
爱丽_19 小时前
GC 怎么判定“该回收谁”:GC Roots、可达性分析、四种引用与回收算法
java·jvm·算法
bbq粉刷匠19 小时前
Java--多线程--单例模式
java·开发语言·单例模式