深入学习Java Web服务器系列一
一个简单的静态web容器
我们下面来实现一个简单的静态web容器。
这个服务器要实现的功能很简单,就是启动监听,当用户在浏览器输入URL发送http请求时,服务器进行解析并返回请求的静态资源。系统的时序图如下所示:
下面我们一起来实现这个简单的静态web服务器。
本文分成三个部分,第一和第二部分为知识介绍,简单介绍一下http协议和Socket协议,因为这两个协议是实现服务器的核心,我们只有熟悉这两个协议才能理解服务器的整个运作流程,第三部分我们将用代码实现这个服务器。
1. HTTP协议
HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送和接受数据。它是一种请求和响应协议。客户端请求一个文件而服务器响应请求。HTTP使用可靠的TCP连接–TCP默认使用80端口。
在HTTP中,始终都是客户端通过建立连接和发送一个HTTP请求从而开启一个事务。web服务器不需要联系客户端或者对客户端做一个回调连接。无论是客户端或者服务器都可以提前终止连接。举例来说,当你正在使用一个web浏览器的时候,可以通过点击浏览器上的停止按钮来停止一个文件的下载进程,从而有效的关闭与web服务器的HTTP连接。
HTTP请求
一个HTTP请求包括三个组成部分:
- 方法—统一资源标识符(URI)—协议/版本
- 请求的头部
- 主体内容
下面是一个HTTP请求的例子:
POST /examples/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) Content-Length: 33 Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
请求的头部包含了关于客户端环境和请求的主体内容的有用信息。例如它可能包括浏览器设置的语言,主体内容的长度等等。每个头部通过一个回车换行符(CRLF)来分隔的。 对于HTTP请求格式来说,头部和主体内容之间有一个回车换行符(CRLF)是相当重要的。CRLF告诉HTTP服务器主体内容是在什么地方开始的。
HTTP响应
类似于HTTP请求,一个HTTP响应也包括三个组成部分:
- 方法—统一资源标识符(URI)—协议/版本
- 响应的头部
- 主体内容
下面是一个HTTP响应的例子:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 5 Jan 2004 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT
Content-Length: 112
<html>
<head>
<title>HTTP Response Example</title>
</head>
<body>
Welcome!
</body>
</