目录
一、HTTP是应用层协议
二、HTTP服务器
三、HTTP服务
认识请求中的uri
HTTP支持默认首页
响应
功能完善
套接字复用
一、HTTP是应用层协议
HTTP下层是TCP协议,站在TCP的角度看,要提供的服务是HTTP服务。
这是在原来实现网络版计算器时,实现的TCPServer.hpp,在TCP上层是HttpServer时,为了方便代码阅读,修改上层服务的命名为http_server。
对于HTTP服务,接收一次请求字符串,做出一次响应。
在TCP处理服务时,每个线程要做的内容。
为什么要这样处理,不同于网络版计算器。
1.由于TCP面向字节流,不管上层是什么服务(协议),都可能会出现读取到一个不完整请求的情况(黏包问题),所以,在网络版计算器实现时,添加了对协议的解析过程,比如内容长度、\r\n的分割等内容,标识可以有效的帮助我们对收到的请求做处理,确保至少有一个完整的请求。
2.对于HTTP,其实有较大的概率,能得到一个完整的请求,因此,不再添加对HTTP的黏包处理过程。
二、HTTP服务器
简单的搭建一个HTTP服务器,用Windows浏览器访问,查看HTTP请求格式。
我们可以简单的把HTTP的请求在服务器端直接打印出来。
接下来开始正式完成Http主体内容。
我们手写的HTTP服务的主要任务是序列化和反序列化这个过程。因此,如何保证HTTP要服务的字符串是一个完整的请求,并不详细的再去用代码实现。
三、HTTP服务
- 一个HTTP服务中,有HTTP请求和HTTP响应。
- 由一个完整的string转化为类成员变量,即结构化数据,这个过程就是反序列化。
- 智能指针管理资源——RAII
- 可以轻松的得到请求行。
- 对应请求头和请求内容,相对复杂。
- 进一步反序列化,获取更加详细的信息
- 解析请求行
- 解析请求头
在Print函数中添加解析后打印的代码
认识请求中的uri
请求中没有指明某一个服务器资源时,请求的默认就是 /
HTTP支持默认首页
请求/ 并不表示请求服务器的根目录,这个根目录表示的是Web根目录。
- 一般在实现服务器的同路径下,有一个保存客户端请求资源的目录,叫做wwwroot,即Web根目录,请求/,即表示请求wwwroot。
- HTTP支持默认首页,所以每一个资源目录下都有index.html。
基于以上两点,请求/本质是请求HTTP服务下的 ./wwwroot/index.html。
- 修改代码
- 拼接首页
- 实际资源与url解耦合,我们可以自己定义path
响应
- Linux支持telnet,可以自己构建完整请求。
- 服务器的工作是收到序列化的请求,把他反序列化后解析,按照请求构造一个序列化的响应
因此,我们所写HTTP服务响应只有序列化的功能。
- 详细字段
- 序列化函数
- 整理一个资源
- Content-Type映射表
功能完善
-
套接字复用