news 2026/9/8 11:31:32

用了几年 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/9/8 7:45:13

视频字幕精确生成方法 用到字幕api开发文档

视频字幕精确生成方法 用到字幕api开发文档 本文档将详细介绍如何调用 /api/stt/audiototexturls 接口完成音频转文字,并基于接口返回的时间轴数据生成 SRT 等格式的精准字幕,帮助开发者快速实现相关功能。 一、接口核心信息梳理 你需要调用的是一个支持…

作者头像 李华
网站建设 2026/9/7 14:31:16

SPA 应用中的路由切换内存泄漏:未注销的 Scroll 监听与全局变量

SPA 应用中的路由切换内存泄漏:未注销的 Scroll 监听与全局变量大家好,我是你们的技术讲师。今天我们来深入探讨一个在现代前端开发中非常常见却又容易被忽视的问题——单页应用(SPA)中的内存泄漏问题,特别是由 未注销…

作者头像 李华
网站建设 2026/9/7 13:15:19

游泳池漆专用施工涂料如何选?专业视角解析耐水抗氯性能

说到游泳池漆哪个牌子好,很多工程方都会头疼。去年我亲自跟进一个市政泳池项目,施工队试了三种漆都出现脱落。后来改用海瑞的水池蓝池底漆,效果确实稳定。 环保安全与施工便捷的双重优势 游泳池漆哪个牌子好,首先要看环保指标。海…

作者头像 李华
网站建设 2026/9/7 23:10:09

中国RFID设备十大企业综合实力解析

(注:以下排名基于技术研发、市场份额、行业应用等维度综合评估)行业领军企业远望谷技术深耕物联网识别领域20年,其超高频读写设备在铁路物流管理市占率达38%,自主研发的$ \lambda \frac{c}{f} $抗干扰算法显著提升多标…

作者头像 李华
网站建设 2026/9/7 21:22:48

C#静态成员总结 常量与只读字段总结 类的继承总结

📝 C# 静态成员总结🎯 核心区别表格特性静态成员/方法非静态成员/方法关键字static无关键字属于谁属于类本身属于类的实例对象调用方式类名.成员名对象.成员名内存位置内存中只有一份每个对象都有独立副本何时创建类加载时(程序启动&#xff…

作者头像 李华