news 2026/5/13 9:34:00

用了几年 Spring Boot,你真的知道请求是怎么进来的吗?—— JDK 原生实现 HTTP 服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用了几年 Spring Boot,你真的知道请求是怎么进来的吗?—— JDK 原生实现 HTTP 服务

目录

      • 一、你有没有真正理解过:一个 HTTP 请求是怎么“飞”到你的代码里的?
      • 二、Spring Boot 为什么能监听和处理请求
      • 三、使用 JDK 自带的 HttpServer实现一个可运行的 HTTP 服务
      • 四、结语:
        • 但你有没有想过:`HttpServer`背后又是谁在监听端口、收发字节?

一、你有没有真正理解过:一个 HTTP 请求是怎么“飞”到你的代码里的?

我们每天都会写的代码:

@RestControllerpublicclassHelloController{@GetMapping("/hello")publicStringhello(@RequestParamStringname){return"Hello, "+name;}}

启动后,浏览器访问 http://localhost:8080/hello?name=张三,立刻返回结果。

但你有没有想过:

  • 客户端发出的请求,是怎么精准到达服务器的 8080 端口?
  • 服务器收到一堆字节流后,怎么知道要调用你的哪个方法?
  • 响应又是什么时候、怎么写回去的?

Spring Boot 隐藏了太多细节,让我们误以为“写注解 = 有服务”。

今天,我们扔掉所有框架,只用 JDK 自带的 API,亲手实现一个真正的 HTTP 服务。

你会发现:一切都没有魔法,只有清晰的协议与流程。

二、Spring Boot 为什么能监听和处理请求

为了对比,我们先用最简洁的方式说清楚 Spring Boot 的原理。

  1. Spring Boot 启动时会自动创建一个嵌入式 Tomcat 实例,并绑定指定端口(默认 8080)。
#比如:server:port:8080
  1. Tomcat 内部基于 Java 的ServerSocket监听 TCP 连接。
  2. 所有 HTTP 请求到达后,Tomcat 解析成ServletRequest/ServletResponse,转发给 Spring MVC 的DispatcherServlet
  3. DispatcherServlet根据注解(如 @RequestMapping)找到对应方法,执行后把返回值序列化成 JSON 写回响应。

整个过程我们几乎没写一行网络代码,却能提供服务。这很强大,但也容易让我们对底层产生“黑盒”感。

现在,我们把所有框架都扔掉——不用 Spring、不用 Tomcat、不用任何第三方库,只用 JDK 自带的 API,来实现一个完整的 HTTP 服务。

三、使用 JDK 自带的 HttpServer实现一个可运行的 HTTP 服务

从 Java 6 起,JDK 提供了com.sun.net.httpserver.HttpServer,这是一个轻量级、纯 Java 实现的嵌入式 HTTP 服务器。代码极简,却已经能完整处理请求和响应。

publicclassMyServer{publicstaticvoidmain(String[]args)throwsIOException{//监听8080端口HttpServerserver=HttpServer.create(newInetSocketAddress(8080),0);//创建一个HttpHandlerHttpHandlerhandler=newMiniHandler();//如果有请求,就交给handlerserver.createContext("/helloHttp",handler);//启动服务器server.start();System.out.println("服务器启动成功");}}publicclassMiniHandlerimplementsHttpHandler{@Overridepublicvoidhandle(HttpExchangeexchange)throwsIOException{//1.获取URL的参数Stringquery=exchange.getRequestURI().getQuery();//拿到第一个参数Stringname=query.split("name=")[1];//2.以json格式返回Stringresponse="{ \"code\": 200, \"message\": \"OK\", \"data\": \"Hello, "+name+"!\" }";//3.发送回复exchange.getResponseHeaders().set("Content-Type","application/json;charset=utf-8");;exchange.sendResponseHeaders(200,response.length());OutputStreamos=exchange.getResponseBody();os.write(response.getBytes(StandardCharsets.UTF_8));os.close();}}

运行这个 main 方法,然后打开浏览器访问http://localhost:8080/helloHttp?name=Http

你会看到:

  1. 客户端(浏览器)发起 TCP 连接到你的机器 8080 端口。
  2. JDK 的HttpServer接受连接,解析 HTTP 请求行、头、查询参数。
  3. 根据路径匹配到对应的HttpHandler
  4. handle方法里,你可以自由读取请求信息(方法、路径、参数、头、body)。
  5. 你手动设置状态码、响应头、内容长度,然后通过getResponseBody()写入字节。
  6. 底层自动把响应通过Socket发回客户端,连接关闭(或保持长连接)。

Spring Boot 没有创造新东西,它只是把重复、易错的底层操作封装成了优雅的 API

四、结语:

到这里,我们已经看清了 HTTP 请求如何通过 JDK 原生 API 被处理。

但你有没有想过:HttpServer背后又是谁在监听端口、收发字节?

答案是:Socket。

HTTP 是一个应用层协议,它依赖于传输层的 TCP 协议进行可靠数据传输,而 TCP 连接在操作系统层面是通过 Socket API 来建立和管理的,下一篇,我们将彻底剥开最后一层封装,用最原始的ServerSocketSocket,从零实现一个能跑通的 HTTP 服务 —— 亲眼看看 TCP 连接是如何建立的,HTTP 报文是如何被一字节一字节解析的。

下期预告:深入 Socket 编程 —— 从零实现一个原始 HTTP 服务器,看清 TCP 连接、字节流、协议解析的全过程。

😊收藏 + 关注,学习不迷路!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 6:57:58

Web Worker 处理图像:将 Canvas 像素处理移出主线程的实现

Web Worker 处理图像:将 Canvas 像素处理移出主线程的实现 大家好,今天我们来深入探讨一个在现代前端开发中越来越重要的技术主题——如何利用 Web Worker 将 Canvas 图像像素处理任务从主线程中剥离出来。这不仅能够显著提升用户体验,还能避…

作者头像 李华
网站建设 2026/5/1 5:49:39

如何使用 `PerformanceMonitor` 实时监控生产环境的内存使用率

使用 PerformanceMonitor 实时监控生产环境内存使用率:从理论到实践各位开发者、运维工程师和架构师,大家好!今天我们要深入探讨一个在现代软件工程中极其关键的话题——如何在生产环境中实时监控内存使用率。特别是在微服务、容器化部署日益…

作者头像 李华
网站建设 2026/5/12 11:19:46

如此简单的RFSOC

前言:之前写过的RFSOC基本功能验证已经过去了很久,随着时间的推移,原形验证已经属于简单的范畴了,接下来的这个篇文章希望可以给众多工程师提供更多的思路来玩转RFSOC1. 很多时候客户需要的不是源码,而是我能用RFSOC做…

作者头像 李华