原力计划-从零实现最简 http 服务器
周末了,你带你的破电脑回到家并不能给你带来任何实质性作用,朋友们兜里掏出一大把钱吃喝玩乐,你默默的在家里摆弄你的破烂 java,spring 全家桶,srpingcloud 看了多少遍算法。亲戚朋友吃饭问你收获了什么,你说我装了个虚拟机,把各个工具都玩了一遍,亲戚们懵逼了,你还在心里默默嘲笑他们,笑他们不懂你的自动注入,不懂你的 10 层代理、不懂你的流量混淆,也笑他们连个复杂点的密码都记不住。你父母的同事都在说自己的子女一年的收获,儿子买了个房,女儿买了个车,姑娘升职加薪了,你的父母默默无言,说我的儿子搞了个破电脑,开起来嗡嗡响、家里电表走得越来越快了。
我就是那个段子里的大冤种,正文开始前自我调侃一下。
随着工作的年限的增长,越来越难写一些基础代码,总感觉自己的底子打的比较差,工作中写不了硬核代码,那我就用业余时间完成吧!我也知道网上代码一大堆,及时自己实现了也不见得有什么收获,就当学习,磨一磨生锈的刀。
若干年前在一个 java 项目中看到用纯 java 手撕前端代码,当时觉的好神奇,也大概只有功力深厚,大牛才能写出这样的代码,我等菜鸡只能写写 CURD,也许是那个时候埋下的种子吧,tomcat 没有精力写,但写一个简单的 http 服务器,让自己的网站跑在这个服务器上,想想也是美滋滋,什么 tomcat,什么 nginx,自己的服务器自己来写。
HTTP 服务器目标:让自己的网站跑在拥有自主知识产权的静态服务器上。
开始前要搞懂 http 协议。
HTTP 协议
HTTP 协议使用客户端-服务器模型,其中客户端发送一个 HTTP 请求到服务器,服务器则返回一个 HTTP 响应。HTTP 请求由请求方法(GET、POST、PUT、DELETE 等)和请求头(包含请求信息的元数据)组成,而 HTTP 响应由状态码(描述服务器对请求的响应)、响应头和响应正文(包含实际数据)组成。
以下是一个使用 HTTP 协议进行请求和响应的简单 demo:
客户端向服务器发送 GET 请求:
1 2 3 4
| GET /hello.txt HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
|
服务器向客户端发送响应:
1 2 3 4 5
| HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 12
Hello World!
|
在这个例子中,服务器返回一个 HTTP/1.1 200 OK 响应码,表示请求成功。响应头中包含了一些附加的信息,例如返回的数据类型和数据长度。响应正文中包含了实际的数据,即 Hello World!。