
教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载本文基于 mcp-for-beginners 课程第 06 章HTTP Streaming的 Java 解题方案完整讲解如何用 Spring Boot WebFlux 实现一个基于 Server-Sent EventsSSE的流式计算服务从FluxServerSentEvent服务端端点、WebClient 消费端的源码逐行剖析到 Maven 构建、命令行运行、curl/浏览器手工验证、API 参数契约与故障排查帮助读者掌握“服务端逐步推送事件、客户端逐条消费事件”这一 HTTP 流式编程的完整实战链路并为后续理解 MCP Streamable HTTP 中的通知notification机制打下基础。课程定位与演示概览该 Java 方案属于课程第 06 章 HTTPS Streaming with Model Context Protocol (MCP) 的官方解题实现之一与 Python、.NET、Rust 版本并列索引见 各运行时解法汇总。本方案对应文档的英文原版位于 solution/java/README.md德语版位于 translations/de/.../java/README.md本文以德语版结构为骨架并结合仓库源码展开。演示由两个独立应用组成Calculator Server一个响应式reactiveWeb 服务执行数学运算并以 SSE 形式流式推送计算过程与结果Calculator Client一个客户端应用订阅该流式端点并逐事件打印输出。环境前置条件原文档要求Java 17 或更高版本Maven 3.6 或更高版本项目结构仓库中 Java 方案的实际目录布局与文档描述一致位于03-GettingStarted/06-http-streaming/solution/java/下java/ ├── calculator-server/ # Spring Boot server with SSE endpoint │ ├── src/main/java/com/example/calculatorserver/ │ │ ├── CalculatorServerApplication.java │ │ └── CalculatorController.java │ ├── src/main/resources/application.yml │ └── pom.xml ├── calculator-client/ # Spring Boot client application │ ├── src/main/java/com/example/calculatorclient/ │ │ └── CalculatorClientApplication.java │ ├── src/main/resources/application.yml │ └── pom.xml └── README.md两个工程都是最小化的 Spring Boot 应用服务端只有启动类和控制器两个类客户端只有一个类便于逐行读懂 SSE 的生产与消费两侧。服务端源码剖析CalculatorController核心实现在 CalculatorController.java全文如下package com.example.calculatorserver; import java.time.Duration; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; import org.springframework.http.codec.ServerSentEvent; RestController public class CalculatorController { GetMapping(value /calculate, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxServerSentEventString calculate(RequestParam double a, RequestParam double b, RequestParam String op) { double result; switch (op) { case add: result a b; break; case sub: result a - b; break; case mul: result a * b; break; case div: result b ! 0 ? a / b : Double.NaN; break; default: result Double.NaN; } return Flux.ServerSentEventStringjust( ServerSentEvent.Stringbuilder() .event(info) .data(Calculating: a op b) .build(), ServerSentEvent.Stringbuilder() .event(result) .data(String.valueOf(result)) .build() ) .delayElements(Duration.ofSeconds(1)); } }结合源码可以确认以下几个关键设计点SSE 端点声明CalculatorController.javaGetMapping通过produces MediaType.TEXT_EVENT_STREAM_VALUE将响应的Content-Type固定为text/event-stream返回值类型FluxServerSentEventString告诉 WebFlux 不要等待全部计算完成再一次性返回而是把Flux中每个元素作为独立 SSE 事件逐个写出——这正是“流式响应”的本质。查询参数契约a、b为double类型op为字符串三者均为必传参数switch分支支持add、sub、mul、div四种运算其中除法在b 0时返回Double.NaN对应文档中“div 在 b 0 时返回 NaN”的说明非法运算同样落到default分支返回NaN——源码中目前没有额外的错误响应这为后文“下一步改进”中“为非法操作增加错误处理”提供了依据。事件构造使用ServerSentEvent.builder()构造两个带事件名的事件——event(info)携带计算过程描述如Calculating: 7.0 mul 5.0event(result)携带最终结果如35.0。SSE 协议允许事件携带自定义event字段客户端可据此区分“过程事件”和“结果事件”这是比裸文本分块更结构化的做法。.delayElements(Duration.ofSeconds(1))让两个事件之间相隔 1 秒推送用于模拟真实场景中“计算耗时、逐段产出中间状态”的流式节奏让客户端能明显观察到事件是“到达一条、处理一条”而不是一次性到达。启动类 CalculatorServerApplication.java 是标准的SpringApplication.run(...)入口无额外逻辑。服务端构建配置pom.xml 要点calculator-server/pom.xml 的关键配置通过dependencyManagement导入spring-boot-dependencies3.3.1的 BOM 统一管理版本唯一业务依赖是spring-boot-starter-webflux注释标明用途即 SSE。从源码结构看项目未引入spring-boot-starter-web因此内嵌服务器为 Netty 而非 Tomcat这也是启动日志出现Netty started on port 8080的原因maven-compiler-plugin3.11.0显式开启parameterstrue/parameters等价于javac -parameters。这一点很重要Spring 的RequestParam在没有显式value时依赖编译期保留的参数名做绑定缺少该标志会导致参数绑定失败——文档“故障排查”一节专门提到了这一点spring-boot-maven-plugin使mvn spring-boot:run与可执行 fat jar 可用。服务端端口配置在 calculator-server/src/main/resources/application.ymlserver: port: 8080即默认监听http://localhost:8080若端口冲突修改此文件中的port即可。客户端源码剖析CalculatorClientApplication客户端实现在 CalculatorClientApplication.javapackage com.example.calculatorclient; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.client.WebClient; SpringBootApplication public class CalculatorClientApplication implements CommandLineRunner { private final WebClient client WebClient.builder() .baseUrl(http://localhost:8080) .build(); public static void main(String[] args) { SpringApplication.run(CalculatorClientApplication.class, args); } Override public void run(String... args) { client.get() .uri(uriBuilder - uriBuilder .path(/calculate) .queryParam(a, 7) .queryParam(b, 5) .queryParam(op, mul) .build()) .accept(MediaType.TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(String.class) .doOnNext(System.out::println) .blockLast(); } }源码级要点CommandLineRunner驱动应用启动后自动执行run(...)发起一次固定请求——计算7 * 5a7、b5、opmul跑完即结束无需额外触发WebClientbaseUrl以响应式 WebClient 访问http://localhost:8080与Flux响应天然匹配.accept(MediaType.TEXT_EVENT_STREAM)显式声明Accept: text/event-stream与服务器端的produces协商一致.bodyToFlux(String.class)把 SSE 流解码为FluxString每收到一个事件就触发一次下游回调.doOnNext(System.out::println)对每个到达的事件立即打印到控制台直观呈现“边收边处理”的流式消费模式.blockLast()阻塞等待流结束保证事件全部消费完应用才退出。从源码结构看这是“一次性演示客户端”的典型写法生产环境中通常不会阻塞主线程。客户端的 application.yml 只有一处配置spring: main: web-application-type: none即禁用 Web 容器客户端虽然同样依赖spring-boot-starter-webflux为了获得 WebClient 与 Reactor 运行时但自身不对外暴露任何 HTTP 端口避免与服务器争用端口。客户端的 pom.xml 与服务端完全同构Spring Boot 3.3.1、webflux starter、-parameters编译配置、0.0.1-SNAPSHOT版本。端到端工作流程原文档“Funktionsweise工作原理”描述的链路结合源码可以归纳为Calculator Server暴露GET /calculate端点接受查询参数a数字、b数字、op操作名支持的操作add、sub、mul、div以 Server-Sent Events 返回计算过程info事件与结果result事件。Calculator Client连接服务器发起计算7 * 5的请求消费流式响应将每个事件打印到控制台。数据在 HTTP 层上的形态是标准 SSE 报文每个事件由event:与data:字段组成、以空行分隔Content-Type为text/event-stream两个事件之间因delayElements相隔约 1 秒到达。运行应用方式一使用 Maven推荐1. 启动 Calculator Server打开终端并进入服务器目录相对仓库根目录cd 03-GettingStarted/06-http-streaming/solution/java/calculator-server mvn clean package mvn spring-boot:run服务器启动于http://localhost:8080预期看到类似输出Started CalculatorServerApplication in X.XXX seconds Netty started on port 8080 (http)2. 启动 Calculator Client打开新终端并进入客户端目录cd 03-GettingStarted/06-http-streaming/solution/java/calculator-client mvn clean package mvn spring-boot:run客户端会连接服务器、执行计算并显示流式结果。方式二直接用 Java 运行打包产物1. 编译并启动服务器cd calculator-server mvn clean package java -jar target/calculator-server-0.0.1-SNAPSHOT.jar2. 编译并启动客户端cd calculator-client mvn clean package java -jar target/calculator-client-0.0.1-SNAPSHOT.jar两个 jar 文件名与 服务端 pom.xml、客户端 pom.xml 中artifactId加0.0.1-SNAPSHOT版本号的命名规则一致。手工验证服务器不依赖客户端也可以用浏览器或 curl 直接测试端点浏览器方式访问http://localhost:8080/calculate?a10b5opaddcurl 方式curl http://localhost:8080/calculate?a10b5opadd -H Accept: text/event-stream注意Accept头需要与端点的produces text/event-stream匹配。预期输出运行客户端时控制台应出现如下流式输出先到达过程事件约 1 秒后到达结果事件event:info data:Calculating: 7.0 mul 5.0 event:result data:35.0支持的操作add—— 加法a bsub—— 减法a - bmul—— 乘法a * bdiv—— 除法a / b当 b 0 时返回 NaNAPI 参考GET /calculate参数参数类型必填说明adouble是第一个操作数bdouble是第二个操作数opstring是操作名取值add/sub/mul/div响应Content-Type:text/event-stream返回携带计算过程与结果的 Server-Sent Events示例请求GET /calculate?a7b5opmul HTTP/1.1 Host: localhost:8080 Accept: text/event-stream示例响应event: info data: Calculating: 7.0 mul 5.0 event: result data: 35.0故障排查常见问题端口 8080 已被占用结束占用 8080 端口的其他应用或修改 calculator-server/src/main/resources/application.yml 中的server.port。连接被拒绝Connection refused确保先启动服务器、确认其已在 8080 端口成功启动后再启动客户端。参数绑定问题本项目包含带-parameters标志的 Maven 编译器配置见两个 pom.xml 中的maven-compiler-plugin配置若遇到RequestParam参数绑定异常请确认项目是按该配置构建的。停止应用在运行对应应用的终端中按CtrlC若应用作为后台进程运行也可使用mvn spring-boot:stop原文档给出的停止方式。技术栈Spring Boot 3.3.1—— 应用框架Spring WebFlux—— 响应式 Web 框架Project Reactor—— 响应式流库Flux、delayElementsNetty—— 非阻塞 I/O 服务器Maven—— 构建工具Java 17—— 编程语言以上版本信息均可在两个工程的 pom.xml 中直接核对spring.boot.version3.3.1/spring.boot.version、java.version17/java.version。下一步与延伸方向原文档建议通过修改代码继续练习增加更多数学运算为非法操作名加入错误处理源码目前对未知op仅返回NaN可以升级为返回错误事件或 HTTP 错误码增加请求/响应日志实现认证补充单元测试。此外本演示是“经典 HTTP 流式chunked/SSE”与 MCP 流式基于 JSON-RPC 通知对比教学中的经典流式一侧经典流式把过程数据作为响应分块直接推送而 MCP 中主响应仍是单一结果、过程信息通过通知消息单独下发。学完本 Java 示例后建议回到章节主文档 03-GettingStarted/06-http-streaming/README.md 继续阅读“Classic vs MCP Streaming”对比、通知级别表以及 SSE 到 Streamable HTTP 的迁移要点把 SSE 端点实践经验迁移到 MCP 场景。相关文件索引文件说明solution/java/README.md英文原版文档本方案主文档德语版文档本文骨架来源的翻译版本CalculatorController.javaSSE 端点核心实现CalculatorServerApplication.java服务器启动类CalculatorClientApplication.javaWebClient 流式消费实现server pom.xml / client pom.xml构建与-parameters编译配置server application.yml / client application.yml端口与web-application-type: none配置各运行时解法汇总Python / Java / .NET / Rust 对照入口赞分享教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载相关推荐mcp-for-beginners 实战用 Spring Boot WebFlux 构建 Java 计算器 MCP 服务HTTPSSE 传输mcp for beginners 实战用 Spring Boot WebFlux 构建 Java 计算器 MCP 服务HTTPSSE 传输 导读 本篇教程文档人工智能mcp-for-beginners 实战用 Spring Boot WebFlux SSE 构建 HTTP 流式计算服务Calculator HTTP Streaming Demo 全解析mcp for beginners 实战用 Spring Boot WebFlux SSE 构建 HTTP 流式计算服务Calculator HTTP教程文档人工智能用 Spring Boot 构建 Java MCP 计算器服务HTTPSSE 传输入门实战mcp-for-beginners用 Spring Boot 构建 Java MCP 计算器服务HTTPSSE 传输入门实战mcp for beginners 本文以 mcp for b教程文档人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考