HTTP服务器的工作逻辑
一、主要目的
介绍HTTP服务器的工作逻辑。
二、主要内容
(一)技术路线
每个请求对应一个TCP连接。
每个请求对应一个线程任务。
用线程池执行每个任务。
只探讨简单的TCP短连接返回HTML资源的情形。
(二)HTTP服务器的核心逻辑
// 初始化各种资源
// 建立服务端TCP套接字,绑定端口,设置最大连接数
// 建立线程池
init();
// 进入循环,用变量控制循环的进行
while(运行为真){
// 阻塞获取一个客户端的TCP套接字
// 用客户端套接字创建一个线程任务
// 把线程任务提交到线程池执行
}
// 后续处理
destoy();
(三)线程任务的逻辑
// 建立TCP套接字的输入流,输出流
// 读取一行,获得HTTP请求行
// 循环读取每个HTTP请求头,直到空行
// 每个请求头根据":"分割,去除两端多余空白字符,加入到散列表Map中
// 判断是否为Get请求
if(是GET请求){
// 获得请求资源路径,解码成原始的URL格式
// 去除后面的请求参数(如果存在)
// 根据项目目录的磁盘路径,连接资源路径
// 用文件接口判断该资源是不是存在
if(资源存在){
// 设置Content-Length响应头的值是文件的字节数
// 输出HTTP 200响应头部
// 把项目下对应资源文件的所有字节接在头部后面输出到TCP套接字中
} else {
// 文件不存在,输出404响应
// 响应内容格式如下:
" HTTP/1.1 404 Not Found\r\n
Server: TT\r\n
Content-Type: text/plain\r\n
Content-Length: 10\r\n
\r\n
Not Found
"
}
} else {
// 输出不支持方法的响应
// 响应内容格式如下:
" HTTP/1.1 405 Not Support\r\n
Server: TT\r\n
Content-Type: text/plain\r\n
Content-Length: 11\r\n
\r\n
Not Support
"
}
// 刷新输出流
// 关闭TCP套接字
socket.close();