news 2026/6/26 17:10:46

用了几年 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/6/24 16:57:46

制砂机远程监控运维管理系统方案

制砂机作为矿山、建筑及道路工程中破碎与制砂作业的核心设备,其运行效率与稳定性直接关系到工程进度与产品质量。制砂机在工作过程中,涉及电机转速、进料量、出料粒度、振动强度及轴承温度等多个关键参数的实时监控与调节。 但传统运维方式依赖现场巡检与…

作者头像 李华
网站建设 2026/6/26 15:25:50

数字化航空的安全基石:测试人员如何应对DO-178C与网络安全双重要求

航空软件安全认证的重要性 航空软件安全认证是确保航空系统(如飞行控制、导航和通信系统)在极端环境下可靠运行的关键流程。对于软件测试从业者而言,理解认证标准(如DO-178C)不仅是合规要求,更是保障乘客安…

作者头像 李华
网站建设 2026/6/25 11:31:48

利用 `Object.defineProperty` 实现 Vue2 风格的数组变异方法监听

利用 Object.defineProperty 实现 Vue2 风格的数组变异方法监听 各位同学,大家好!今天我们来深入探讨一个在前端开发中非常经典且重要的问题:如何实现类似 Vue 2 中对数组变化的响应式监听机制。这不仅是理解 Vue 响应式原理的核心环节&…

作者头像 李华
网站建设 2026/6/26 0:39:58

Redux 中间件原理:洋葱模型(Onion Model)的 `compose` 函数手写实现

Redux 中间件原理详解:洋葱模型与 compose 函数的手写实现各位开发者朋友,大家好!今天我们来深入探讨一个在 Redux 生态中非常重要但又常被忽视的概念——中间件的执行机制,尤其是其中的核心设计思想:洋葱模型&#xf…

作者头像 李华