mcp~客户端与服务端的通讯技术
mcp通讯协议
- stdio
- sse
- streamable http
JSON_RPC
MCP 的传输层负责将 MCP 协议消息转换为 JSON-RPC 格式进行传输,并将接收到的 JSON-RPC 消息转换回 MCP 协议消息
- 请求
{
jsonrpc: "2.0",
id: number | string,
method: string,
params?: object
}
- 响应
{
jsonrpc: "2.0",
id: number | string,
result?: object,
error?: {
code: number,
message: string,
data?: unknown
}
}
一 stdio
本地化部署mcp server后,本机上的gpt工具集成了mcp client skd,然后通过本地进程与mcp server进行通讯
二 sse
MCP 早期采用 HTTP+SSE(Server-Sent Events)实现客户端与服务器的通信,但存在以下问题:
- 不支持断线恢复:SSE 连接中断后会话状态丢失,需重新开始。
- 服务器资源压力大:需为每个客户端维护长连接,高并发时资源消耗显著。
- 单向通信限制:服务器只能通过 SSE 端点单向推送消息,无法灵活处理双向交互。
- 基础设施兼容性差:CDN、防火墙等可能中断长连接,导致服务不可靠。
客户端和服务端通讯原理
- 客户端向服务服务/sse节点发起get请求,它是一个长连接,
connection keep-alive,accept text/event-stream - 服务端返回endpoint节点,并带上sessionId标识,之后服务端向客户端推送的数据,也是从这个/sse节点完成
- 客户端向endpoint节点发起post请求,将问题以请求体的形式发给mcp server
- mcp server获取当前endpoint+sessionId,对请求体处理,并通过/sse接口推送到客户端

sdk处理流程

实际工作过程总结
连接建立
客户端请求 /sse;
服务端初始化 SseEmitter 和 McpServerSession,返回可用的消息接口地址。
会话初始化
客户端通过 /message 发送 InitializeRequest,告知能力与标识;
服务端处理后通过 SSE 返回 InitializeResponse。
资源管理
客户端发起如 tools/list 请求;
服务端从会话中查找状态,调用工具处理器并通过 SSE 返回结果。
调用工具
客户端拼接 prompt 后发起 tools/call;
服务端查找处理器执行逻辑,并通过 SSE 返回执行结果。
连接维持
客户端周期性发送 ping;
服务端返回 pong,用于保持连接活跃。
连接关闭
客户端主动断开;
服务端清理对应的连接与会话状态。
java-webflux正确引用
使用快照版1.0.0-SNAPSHO,引用包spring-ai-starter-mcp-server-webflux
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用标准版1.0.0-M6,引用包spring-ai-mcp-server-webflux-spring-boot-starter会出现无sessionId参数的问题
三 streamable http
Streamable HTTP 通过以下设计解决了SSE的问题:
统一端点
移除专用的 /sse 端点,所有通信通过单一端点(如 /mcp)完成,支持 POST 和 GET 请求。按需流式传输
服务器可灵活选择响应方式:- 普通 HTTP 响应:适用于简单请求(如计算任务)。
- 升级为 SSE 流:用于需持续推送的场景(如进度反馈)。
- 维持长连接:支持双向流式交互(如多轮对话)。
会话标识与状态管理
引入会话 ID 机制(通过 Mcp-Session-Id 头部传递),支持断线重连和状态恢复。服务器可选择无状态(Stateless)或有状态(Stateful)模式运行。灵活初始化与恢复
- 客户端可通过空 GET 请求主动初始化 SSE 流。
- 断线后,客户端可通过会话 ID 重新连接并恢复上下文。
Streamable HTTP 的优势
- 兼容性与扩展性
- 纯 HTTP 实现,兼容 CDN、API 网关等现有基础设施。
- 支持无状态服务器,适合 Serverless 架构(如 AWS Lambda)。
- 性能优化
- 复用 TCP 连接,减少高并发下的连接数(测试显示,1000 并发用户时连接数仅为 HTTP+SSE 的 1/10)。
- 平均响应时间更短(Streamable HTTP 为 0.0075s,HTTP+SSE 为 1.5112s)。
- 客户端简化
- 相比 HTTP+SSE 需维护双通道,Streamable HTTP 客户端代码量减少 40% 以上,仅需处理统一端点。
- 灵活部署
- 支持无状态模式,避免强制粘性会话(Sticky Session),便于水平扩展。
- 适用于云原生架构,如 Kubernetes 动态扩缩容。
典型应用场景
- 无状态服务(如数学计算工具)
客户端直接发送 POST 请求,服务器返回即时 HTTP 响应,无需维护会话。
- 流式进度反馈(如大文件处理)
服务器通过 SSE 流分阶段推送进度(如 10%、30%),完成后关闭连接。
- 多轮对话 AI(如上下文感知助手)
初始化会话后,通过会话 ID 维持上下文,支持多轮交互与断线恢复。
- 弱网络环境
网络中断后,客户端可携带会话 ID 重新连接,从断点继续任务。
开发语言的选择
mcp-java-sdk 暂未支持新版 Streamable HTTP 协议,需要继续使用SSE实现,当然你也可以采用pyton-sdk,它是有支持的。

mcp~客户端与服务端的通讯技术的更多相关文章
- Docker学习笔记 - Docker客户端和服务端
学习内容: Docker客户端和服务端的通讯方式:client和自定义程序 Docker客户端和服务端的连接方式:socket 演示Docker客户端和服务端之间用remote-api通讯:nc ...
- java客户端与服务端交互通用处理 框架解析
一.综述 java 客户端与服务端交互过程中,采用NIO通讯是异步的,客户端基本采用同一处理范式,来进行同异步的调用处理. 处理模型有以下几个要素: 1. NIO发送消息后返回的Future 2. 每 ...
- 在HTTP通讯过程中,是客户端还是服务端主动断开连接?
比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接.我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触 ...
- 基于socket.io客户端与服务端的相互通讯
socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先 ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- 新手入门贴:史上最全Web端即时通讯技术原理详解
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
- SignalR 实现web浏览器客户端与服务端的推送功能
SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
随机推荐
- 利用JS 代码块 为你的 Typecho博客添加一个 Copy 按钮
引入 JS 将以下代码添加到主题 header.php 中的 </head> 标签前,本主题也可以前往 控制台 - 设置外观 - 主题自定义扩展,将它添加到 自定义 HTML 元素拓展 - ...
- Docker - 部署zyplayer_doc团队协作文档
原文链接:https://mp.weixin.qq.com/s/ew3O0EKLo8KoOMkpT-IePw 一.介绍 zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,提 ...
- burpsuite激活
激活burpsuite--教程 点击Start 文件,把三个框都选上 点击RUN,会自动启动,复制一下那个证书 粘贴刚刚复制的密钥,点击下一个即可 这里点击手动激活,复制请求,粘贴到刚刚那个激活程序的 ...
- Web前端入门第 10 问:HTML 段落标签( <p> )嵌套段落标签( <p> )的渲染结果会怎样?
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 曾经有一个神奇的 bug 摆在我面前,为什么套娃一样的 HTML 语法,在段落标签 <p> 身上不生 ...
- 下载文件,后端返回的是文件流,我们需要请求并下载到本地,发现下载后打开只有个undefined
在项目里做完上传,做下载的时候,把下载的文件打开,内容却时undefined,而且接口调用成功,但是postman校验接口时下载的文件正常的,那问题又出现在前端了. 我的前端代码如下图 前端代码的话我 ...
- 分享一个我遇到过的“量子力学”级别的BUG。
你好呀,我是歪歪. 前几天在网上冲浪的时候,看到知乎上的这个话题: 一瞬间,一次历史悠久但是记忆深刻的代码调试经历,"刷"的一下,就在我的脑海中蹦出来了. 虽然最终定位到的原因令人 ...
- 继承内存图--java进阶 day01
主方法进栈,有new进堆 堆内存中先存自己类中有的变量 又因为继承了父类,所以父类中的变量也要存入 即使被私有化,依旧可以继承,只是没有权限使用! 创建对象时,会调用构造方法,所以走构造方法,实参传形 ...
- 【Git】在 Eclipse 中使用 Git
在 Eclipse 中使用 Git Eclipse 中默认自带了 Git 插件,通过点击 Help→About Eclipse IDE 可以查看 1 全局配置 1.1 配置用户名和邮箱 点击 Wind ...
- 【Web】支持纯静态的Layuimini版本
支持纯静态的Layuimini版本 本人做了点小小的改动,在来的基础上添加了对静态的支持. 零.起因 要做个项目,但是用的是JSP,想着用Layui,然后去找模板,发现这个Layuimini.但是这个 ...
- Java+Selenium+Junit实现web自动化demo
1.新建maven工程 打开IDEA新建maven项目并引入相关依赖,步骤如下: 需要引入的依赖 <dependencies> <dependency> <groupId ...