手把手带你写一个 MiniTomcat
郭屹
前 Sun Microsystems Java 研发工程师
1792 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 22 讲
开篇词 (1讲)
手把手带你写一个 MiniTomcat
15
15
1.0x
00:00/00:00
登录|注册

02|初出茅庐:构造一个极简的HttpServer

你好,我是郭屹,今天我们继续学习手写 MiniTomcat,从这里开始要同步写代码了。
与 MiniSpring 相同,我们也会从一个最简单的程序开始,一步步地演化迭代,最终实现 Tomcat 的核心功能。这节课,我们就来构造第一个简单的 Web 服务器应用程序。结构如图所示:
可以看出,当用户从浏览器这端发起一个静态的请求时,这个极简 HTTP Server 仅仅是简单地将本地的静态文件返回给客户端。这也正是我们手写 MiniTomcat 的第一步。

Web 请求流程

一个 Web 服务器,简单来讲,就是要按照 HTTP 协议的规范处理前端发过来的 Request 并返回 Response。在这节课中,我们计划请求 http://localhost:8080/test.txt 这个地址,实现一个最简单的 Web 应用服务器。
我们简单回顾一下,在浏览器中输入一个网页地址,键入回车的那一刻,从请求开始到请求结束这个过程会经历几步。
DNS 解析,将域名解析为 IP 地址。
与目标端建立 TCP 连接。
发送 HTTP 请求。
服务器解析 HTTP 请求并返回处理后的报文。
浏览器解析返回的报文并渲染页面。
TCP 连接断开。
在这个过程中,还有很多诸如三次握手,DNS 解析顺序等具体技术细节,因为不是这节课的主要论题,所以这里不再详细说明。在上述 Web 请求流程中,我们重点关注“发送 HTTP 请求”“服务器解析 HTTP 请求并返回处理后的报文”以及“浏览器解析返回的报文并渲染页面”这三步。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何通过手写代码构建一个极简的HTTP服务器,涉及了Web请求的流程、项目结构和Request请求类的构建过程,以及如何构造服务器来接收客户端的请求并返回处理后的报文。文章展示了如何构建Response返回对象,以及如何将HTTP服务器变成一个应用服务器。通过学习本文,读者可以了解到构建一个极简的HTTP服务器的基本流程和关键技术点,为进一步深入学习和实践打下基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniTomcat》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 猛禽不是鸟
    在应用服务器中维护一个请求地址和对应处理类【方法】的映射关系,然后在parse解析出来uri之后,通过映射关系找到对应的处理方法。

    作者回复: 赞👍🏻

    2024-02-19归属地:广东
    1
  • 听风有信
    应用服务器的话,要根据客户端的请求,然后执行相应的业务处理程序,最后将业务程序的输出返回给客户端,这种输出的内容是动态生成的。

    作者回复: 过程是这样。这些问题是思考题,没有标准答案,只是启发式的。从静态文本到程序动态生成,最简单的就是提供一个接口,服务器加载实现类,调用固定的方法,返回字符串。

    2023-12-18归属地:广东
    1
  • Xiaosong
    好奇为什么parseUri要写的这么麻烦,直接requestString.split(' '),检查一下length,然后 取第二个不就行了吗

    作者回复: 这是出于性能的考虑,网络程序,直接从流上拿字节。

    2024-01-25归属地:美国
  • 健康的小牛犊
    Spring和tomcat是如何结合在一起的呢,按理说tomcat本身就可以作为一个web服务器了,那spring的作用是啥呢

    作者回复: Spring是一个应用程序框架,不是服务器。

    2024-01-02归属地:江苏
    3
  • Geek_50a5cc
    如果将读取的文件内容,放在message里面返回过去; String Message = "HTTP/1.1 404 FIle Not Found\r\n" + "Content-Type: text/html\r\n" + "Content-Length: 23\r\n" + "\r\n" + "<h1>"+ result.toString() + "</h1>"; output.write(Message.getBytes()); 如果文件里 字符 很多的时候,这个是否都会完全输出显示出来呢; (result就是文件字节流转换的字符串)

    作者回复: http协议没有限制响应数据的大小,理论上没有规定。不过实际服务器和应用场景,可以自行规定大小限制。

    2023-12-15归属地:北京
  • Koyi
    Request类 第13行 读取数据时,使用一个while循环判断返回值是否大于0以保证成功读取完数据是不是好些

    作者回复: 往后看,现在是起步的粗糙版本。

    2023-12-13归属地:上海
  • 阿加西
    参考了《How Tomcat Works》

    作者回复: 经典必须的。一步步自己写下来。

    2023-12-12归属地:中国香港
  • 旷野之希
    我遇到一个问题,当时随便使用了一个端口号7000,会报403 forbidden的异常,但是换一个端口,比如8888就可以正常访问hello.txt了,这可能是什么原因呢?
    2024-03-07归属地:加拿大
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部