为什么SSE无法代替Webscoket

我之前有个疑问SSE是前端给后端发消息,后端给前端推送,Webscoket不是这样吗,还有sse那种流式推送和后端return的区别。

下面是总结:

长轮询、SSE、WebSocket 完整总结

底层都是 TCP 网络,只是上层应用协议、连接模型不一样

1. 长轮询

  • 协议:纯 HTTP 短连接,没有协议升级,每次都是完整 http 请求响应
  • 流程:前端发 http 请求,后端先把请求挂住不返回;等到有新数据才响应回来。前端收到响应,立刻再发起下一个新 http 请求。
  • 流向:双向,前端可以传参数,后端返回数据
  • 缺点:每一次数据交互都要完整 HTTP 报文,有请求头、重复建立连接开销,性能一般
  • 使用场景:老旧浏览器兼容兜底,现在新项目很少优先用

本质就是不停循环发普通 http 请求。

2.SSE(服务器推送事件,AI 流式打字就是它)

  • 协议:HTTP 长连接,不改变 HTTP 协议 ,响应头固定Content‑Type: text/event‑stream
  • 流程:前端只发起一次 http 请求,连接保持不断开。后端可以持续分段把碎片数据源源不断推给前端,一边生成一边发送,页面就是打字效果。
  • 流向:单向!只允许后端 → 前端推送消息 ⚠️重点:这条 SSE 长连接管道前端不能发数据给后端 。 如果前端要给后端发指令(点击按钮、发送提问),必须额外调用普通@PostMapping/@GetMappingHTTP 接口。
  • 特点:浏览器自带断线自动重连;只支持文本数据
  • 适用场景:大屏监控、日志输出、AI 流式回答;只后端推送,前端很少上报数据

3.WebSocket

  • 协议:握手阶段是 HTTP ,请求头携带Upgrade:websocket,后端返回101 Switching Protocols,完成协议升级。 握手成功之后,TCP 连接保留,不再走 HTTP 协议,切换成 ws 协议。
  • 流程:建立一条持久双向 TCP 通道。 前端调用ws.send()发送消息,不会访问 Controller 的 HTTP 接口 ;消息以 ws 协议帧直接走已有的长连接传给后端。 后端通过@OnMessage回调函数接收消息;后端也可以用 session 直接向前端推送消息。
  • 流向:真正双向,同一条长连接,前后端都可以随时发送消息。后端也可以写定时任务向前端推送,页面效果和 SSE 看起来一模一样。
  • 特点:支持文本、二进制;浏览器没有自动重连,需要自己写代码处理断线。
  • 适用场景:聊天、在线游戏、协同编辑;前后端需要频繁互相发送消息。
相关推荐
秋饼19 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
文丑颜不良啊20 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊1 天前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发1 天前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力1 天前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力1 天前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A1 天前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵1 天前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
nice_lcj5201 天前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
微小的鱼1 天前
Linux的渲染与显示系统链路
android·java·linux