浅谈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/22 6:55:23 阅读更多 →
10天极简C++入门:从环境搭建到实战通讯录系统

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

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

2026/7/22 6:55:23 阅读更多 →
Windows 11 设置多个ip

Windows 11 设置多个ip

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

2026/7/22 6:54:23 阅读更多 →

最新新闻

C2000 GPIO与X-BAR架构:从寄存器到Driverlib的灵活信号路由

C2000 GPIO与X-BAR架构:从寄存器到Driverlib的灵活信号路由

1. 从寄存器到Driverlib:理解C2000 GPIO的抽象层 如果你是从51单片机或者STM32这类MCU转过来的工程师,第一次翻开C2000的技术参考手册(TRM),看到那动辄几十页、密密麻麻的GPIO寄存器描述,可能会感到一阵眩晕…

2026/7/22 7:41:42 阅读更多 →
AI论文降重技术解析与工具实战指南

AI论文降重技术解析与工具实战指南

1. 论文降重的痛点与AI解决方案写论文最头疼的环节莫过于查重降重了。我指导过上百名学生的毕业论文,发现90%的学生在降重环节花费的时间甚至超过了论文撰写本身。传统的手动降重不仅效率低下,还容易破坏原文逻辑和学术性。直到去年接触了几款AI降重工具…

2026/7/22 7:41:42 阅读更多 →
深入解析I2C总线:时钟同步、仲裁与数据格式的嵌入式通信核心

深入解析I2C总线:时钟同步、仲裁与数据格式的嵌入式通信核心

1. I2C总线:嵌入式世界的“默契对话”协议在嵌入式系统开发中,我们常常需要让微控制器(MCU)与各种外围芯片“对话”,比如读取温度传感器的数据、配置显示屏的参数,或者向EEPROM存储器写入配置信息。如果为每…

2026/7/22 7:41:42 阅读更多 →
车载ECG与PPG融合的心率监测技术解析

车载ECG与PPG融合的心率监测技术解析

1. 车载心率监测技术的行业背景与需求在智能汽车快速发展的当下,车载智能座舱已经从单纯的娱乐信息系统进化为全方位的驾乘健康管理平台。根据行业调研数据显示,约23%的交通事故与驾驶员突发性健康问题相关,其中因心率异常导致的驾驶失控占比…

2026/7/22 7:41:42 阅读更多 →
UE5到UE6.5 C++项目迁移:七步零错误法与编译器兼容性实战

UE5到UE6.5 C++项目迁移:七步零错误法与编译器兼容性实战

1. 项目概述:从UE5到UE6.5,一次必须的“心脏移植”如果你正在用C深度开发UE5项目,并且已经听到了UE6.5引擎的“脚步声”,那么你大概率正面临一个既兴奋又头疼的抉择:要不要升级?怎么升级?作为一…

2026/7/22 7:41:42 阅读更多 →
deveco studio loongarch应用编译

deveco studio loongarch应用编译

deveco studio loongarch应用编译(标准系统) 下载deveco studio(目前只支持windows和mac) deveco studio 获取支持loongarch的sdk 查看官网或者联系相关销售、技术人员 在deveco studio中配置loongarch-sdk 解压sdk包到某个位置,如D:/ohos-sdk/...(此条操作最…

2026/7/22 7:40:41 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻