浅谈SSE流+HTTP和streamable HTTP
在学MCP协议时MCP在本地通信用stdio协议而在远程通信采用SSE流HTTP。后来由SSE流HTTP升级为Streamable HTTP。我也是临时学习了一下这两者的异同优劣在这里和大家分享浅谈一下。【注】所以无论是SSE流还是Streamable讨论的范围都是传输层transport的事。什么是SSE流Server-Sent Events流可以理解成“数据通道”应该是来自于Bash那边的专业术语。SSE流翻译过来是服务器发送事件可以理解一种端到端的传输协议专门服务于服务端发送数据数据在协议中称为事件events利用HTTP协议进行单向传输传输到客户端。当然服务端是受到客户端的申请请求才会发送数据不会无缘无故的发送数据。异同点SSE流和Streamable 都是用于远程通信都会建立一个长连接都能达到双向通信的效果都可做到流式输出。Streamable HTTP 可以记住数据的会话ID做到断点续传而且Streamable HTTP可以按需分配所以总体上会比SSE流更省资源Streamable是单通道也就是双向通道需要一个端口号单通道有POST和GET两种请求方式。SSE是双通道也就是两个单向通道需要二个端口号一个通道用POST请求方式一个用GET请求方式。Streamable即支持像JSON格式响应的短连接也支持SSE长连接。而SSE就只有长连接。Streamable升级里哪里我前面讲Streamable是SSE流的升级版那升级了哪里这要从SSE的缺点说起。SSE的工作模式是收发分离。假如Server端用POST占据3030端口去仅发送数据我用GET占据3031端口去仅接受请求。那Client端就要也用2个端口去接、发数据。Server端收到Client端的请求采用流式输出的方式发送数据到Client端发送一半突然网络故障。此时传统的SSE流协议是无法恢复中断继续传输。只能重新建立对话重新连接。而Streamable 也是用POST占据3030端口去发送数据它接受数据也是靠3030端口,建立双向通道收发一体。当遇到网络故障是POST也是无法工作了但Streamable HTTP还有个替补GET方式。替补也是用3030端口用GET方式去尝试建立短连接相当于搜救兵来搞清楚状况看看到底是网络故障还是Server端自己不发送数据了。如果是网络故障他就会临时升级为长连接也就是化身24小时工作超长待机的战士直到危机解除为止替代POST发送数据到Client端。这个功能叫断点续传。Streamable可以根据需求自由切换长/短连接方式而SSE它只能长连接即使是短连接的业务它也必须24小时侯着直到整个会话结束。所以说Streamable比SSE更省资源或者说Streamable减少了浪费的资源。SSEHTTP的例子# old_http_sse.py from fastapi import FastAPI from fastapi.responses import StreamingResponse import asyncio app FastAPI() # 通道 1客户端通过 POST 发送消息 app.post(/message) async def send_message(): # 收到消息后服务器无法直接返回结果只能返回一个 202 (Accepted) # 意思是“我收到了结果我会通过 SSE 通道推给你” return {status: Message received, check SSE stream} # 通道 2客户端必须通过 GET 保持一个长连接用来接收服务器的推送 app.get(/sse) async def sse_stream(): async def generate(): while True: # 模拟服务器持续向客户端推送数据 yield fdata: 这是服务器主动推送的消息\n\n await asyncio.sleep(2) return StreamingResponse(generate(), media_typetext/event-stream)Streamable HTTP的例子# streamable_http.py from fastapi import FastAPI, Request from fastapi.responses import StreamingResponse, JSONResponse import asyncio app FastAPI() # 唯一通道所有通信都在这一个端点完成 app.api_route(/mcp, methods[POST, GET]) async def mcp_endpoint(request: Request): # 场景 A客户端发来普通请求服务器直接返回普通 JSON一问一答 if request.method POST: data await request.json() # 服务器判断如果不需要流式输出直接返回普通 HTTP 响应 if data.get(type) simple_query: return JSONResponse({result: 这是普通的同步响应}) # 场景 B客户端发来复杂请求服务器“按需升级”为 SSE 流 elif data.get(type) stream_query: async def generate(): for i in range(3): yield fdata: 流式输出第 {i1} 个Token\n\n await asyncio.sleep(1) return StreamingResponse(generate(), media_typetext/event-stream) # 场景 C客户端主动发 GET 请求建立 SSE 流用于接收服务器主动推送 elif request.method GET: async def generate(): while True: yield fdata: 服务器主动推送通知\n\n await asyncio.sleep(3) return StreamingResponse(generate(), media_typetext/event-stream)

相关新闻

从NXP SD卡到STM32H7 eMMC:一个偶发open失败问题的完整排查记录

从NXP SD卡到STM32H7 eMMC:一个偶发open失败问题的完整排查记录

背景项目从 NXP1052(Cortex-M7) SD Card 平台迁移到 STM32H743(Cortex-M7) eMMC 平台后,出现偶发的 sdcard_open 失败问题。应用层逻辑完全一致,底层从 SD 卡换成了 eMMC,SDMMC 控制器自带内部 …

2026/7/26 5:51:31 阅读更多 →
10天极简C++入门:从环境搭建到实战通讯录系统

10天极简C++入门:从环境搭建到实战通讯录系统

1. 项目概述:为什么是C,为什么是10天?如果你点开这篇文章,大概率是想在短时间内,对C这门“古老”又“强大”的编程语言建立一个清晰、可用的认知。在这个Python、JavaScript大行其道的时代,为什么还要学C&a…

2026/7/26 6:56:05 阅读更多 →
Windows 11 设置多个ip

Windows 11 设置多个ip

netsh interface ip add address "以太网" 192.168.1.65 255.255.255.0

2026/7/26 7:05:17 阅读更多 →

最新新闻

AI技术体系与LLM应用实战指南

AI技术体系与LLM应用实战指南

1. AI技术体系全景解析 作为一名长期深耕AI领域的技术从业者,我经常遇到初学者被各种专业术语困扰的情况。今天我们就来系统梳理AI技术栈中的核心概念及其相互关系,帮助大家建立清晰的认知框架。 AI技术体系可以形象地比作一座五层金字塔: …

2026/7/27 12:19:35 阅读更多 →
3个核心场景解锁Superpowers:AI开发助手的进阶工具箱使用指南

3个核心场景解锁Superpowers:AI开发助手的进阶工具箱使用指南

3个核心场景解锁Superpowers:AI开发助手的进阶工具箱使用指南 【免费下载链接】superpowers An agentic skills framework & software development methodology that works. 项目地址: https://gitcode.com/GitHub_Trending/su/superpowers Superpowers是…

2026/7/27 12:19:35 阅读更多 →
内网部署的大模型怎么更新?不联网也能升级

内网部署的大模型怎么更新?不联网也能升级

问: 大模型私有化部署在内网后,模型文件怎么更新?不能联网下载,每次升级都要重新部署一套新环境吗?答: 不需要重新部署,但需要建立一套内网模型更新机制。核心思路是“外部下载、内部同步、灰度…

2026/7/27 12:19:35 阅读更多 →
EmptyDataSet-Swift vs DZNEmptyDataSet:Swift开发者为何选择这款空数据集框架?

EmptyDataSet-Swift vs DZNEmptyDataSet:Swift开发者为何选择这款空数据集框架?

EmptyDataSet-Swift vs DZNEmptyDataSet:Swift开发者为何选择这款空数据集框架? 【免费下载链接】EmptyDataSet-Swift 🎄 DZNEmptyDataSet implement with Swift.A drop-in UITableView/UICollectionView superclass category for showing em…

2026/7/27 12:19:35 阅读更多 →
BQ27Z561-R2电量计标准数据命令全解析:从原理到嵌入式实战

BQ27Z561-R2电量计标准数据命令全解析:从原理到嵌入式实战

1. 项目概述与核心价值在嵌入式硬件开发,尤其是涉及电池供电的设备设计中,如何精准、可靠地获取电池的实时状态,是决定产品续航、安全与用户体验的关键。这不仅仅是读取一个电压值那么简单,它涉及到对电池剩余容量(RSO…

2026/7/27 12:19:35 阅读更多 →
完整指南:Spotube开源音乐播放器的终极体验

完整指南:Spotube开源音乐播放器的终极体验

完整指南:Spotube开源音乐播放器的终极体验 【免费下载链接】spotube 🎧 Open source music streaming app! Available for both desktop & mobile! 项目地址: https://gitcode.com/GitHub_Trending/sp/spotube 在当今数字音乐时代&#xff0…

2026/7/27 12:18:35 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻