「How Tomcat works」这本书的第一个例子是读取文件并输出,如果读取的文件符合 HTTP 协议格式,那么就可以输出到浏览器并展示。
按照这个思路就可以实现一个简单的 HTTP 服务器,服务器的页面以 HTTP 格式保存在磁盘上,虽然这个 demo 并没有什么实际的用途,但是对于理解 HTTP 协议及 HTTP 服务器的实现有很大帮助,本文记录下实现,希望能有所启发。
如何实现
因为将协议数据全部保存到文件中,因此代码中并不对 HTTP 协议做任何处理。
Request
Request 只需要从请求的输入流中解析出 uri 即可,用于定位要访问的页面
1 | import java.io.IOException; |
Response
Response 负责将对应的内容输出到输出流,为了实现简单它还负责了读取文件的职责。
1 | import java.io.File; |
HttpServer
核心的 HttpServer 负责启动 ServerSocket 并绑定到指定端口上,监听到请求后创建 Socket,获取 InputStream 构建 Request 对象,完成 Request 对象解析和 Response 对象构建,之后读取文件并输出。
1 | import java.io.File; |
NetUtils
为了获取到网卡 IP 地址,需要用到一个 NetUtils 工具类
1 | import java.net.InetAddress; |
如何运行
将上述代码放到一个目录下,执行 javac HttpServer.java
编译,不出意外的会生成所有的字节码,所有文件如下
1 | HttpServer.class NetUtils.class Request.class Response.class webroot |
其中 webroot 是一个目录,因为程序中定义了资源文件的存放路径为
1 | System.getProperty("user.dir") + File.separator + "webroot" |
如果不设置 user.dir
系统属性,那么默认是在当前目录下。
接下来在 webroot 目录下创建 HTTP 协议文件,如下是我定义的一个 json 格式的返回数据文件 tip.json
1 | HTTP/1.1 200 SUCCESS |
执行 java HttpServer
命令启动服务
1 | ➜ 1 java HttpServer |
然后在浏览器中输入 http://127.0.0.1:8080/tip.json
,你会看到一个 json 格式的输出

如果想对外提供服务,你可以输入 java HttpServe -s
启动服务,然后就会看到服务绑定到了一个对外的 IP
1 | ➜ 1 java HttpServer -s |
HTTP 协议格式
这里说的是 HTTP 1.1 的协议格式,它使用的是文本格式
如下是一个 HTTP 响应的格式

它主要包含 3 部分数据:
- 状态行。包含协议版本号、code、状态
- 响应报头。这里有响应内容的格式,响应内容的长度
- 响应报文主体。这是真正的业务内容
每一行数据使用 \r\n
作为结尾。