🌈个人主页:Fan_558
🔥 系列专栏:仿muduo
📒代码仓库: 项目代码
🌹关注我💪🏻带你学更多知识
文章目录
- 前言
- Util模块
- 设计意义
- 整体设计
- 代码如下
- HttpRequest模块
- 代码如下
- HttpResponse模块
- 代码如下
- HttpReqCtx模块
- 代码如下
- HttpServer模块
- 代码如下
- 项目整体分析流程
- 小结
前言
HTTP协议模块⽤于对⾼并发服务器模块进⾏协议⽀持,基于提供的协议⽀持能够更⽅便的完成指定协议服务器的搭建
Util模块
设计意义
该模块提供一些功能性接口,用于更好地解析和处理HTTP格式数据的请求行,请求报头,以及文件操作,获取文件类型等
整体设计
URL中,我们的一个资源路径和我们的查询字符串里面可能会有 一些特殊字符,这些特殊字符又会跟我们的url中的特殊字符产生一些 歧义,如果有特殊字符就需要url编码,传递给对方就需要解码 通过HTTP状态码获取描述信息 通过后缀名获取mime,这个mime就是客户端请求的资源型文件,资源型 文件是怎么样的格式,比如html,jpg代码如下
HttpRequest模块
HttpRequest模块与HttpResponse模块模块的设计功能是相似的,为了更好的进行数据解析以及数据的发送,如果你要对数据解析,则需要把数据读取出来,然后将读取的数据构造出一个完整的HTTP格式的请求对象,通过对请求的业务逻辑处理,同时构建出一个完整的HTTP格式的响应对象,最后将响应对象序列化之后发送回对方 在数据解析处理以及返回的过程中会涉及到HTTP格式的请求和相应的处理,所以我们需要这两个类分别构造出HTTP格式的请求和响应对象,方便我们处理数据请求报文的构成
解析其实就是从缓冲区取出一行行数据,然后根据分隔符或条件将一行数据划分填充到HttpRequest中的_method(请求方法) _path(资源路径) _version(协议版本) _body(请求正文) _matches(资源路径的正则提取数据) _headers(头部字段) _params(查询字符串)字段中
代码如下
HttpResponse模块
跟HttpRequest模块的设计类似,这里不再过多赘述
响应报文的构成
代码如下
HttpReqCtx模块
该模块是⼀个HTTP请求接收的上下⽂模块,主要是为了防⽌在⼀次接收的数据中,不是⼀个完整的HTTP请求,则解析过程并未完成,⽆法进⾏完整的请求处理,需要在下次接收到新数据后继续根据上下⽂进⾏解析,最终得到⼀个HttpRequest请求信息对象,因此在请求数据的接收以及解析部分需要⼀个上下⽂来进⾏控制接收和处理节奏。
代码如下
HttpServer模块
关于HttpServer模块的分析也放到项目整体分析流程中了,这里不再多赘述
代码如下
项目整体分析流程
还有些细节需要看server模块分析流程,建议先看完上一篇中的流程分析戳此跳转
具体流程:该项目要实现的是主从reactor 模型服务器,当主reactor 线程获取到新连接后将新连接分发给从属reactor 线程,从属reactor 线程启动可读事件监控,等待客户端发送数据,当执行可读事件回调时会将 socket 中的数据放入到接收缓冲区当中,当接收缓冲区中的数据大于0时,执行处理缓冲区数据的回调,即从接收缓冲区中取出一行行数据并分割填充到 HttpRequest 中对应要素中,接着进行业务处理,看看是对静态资源的请求处理还是功能性请求处理,最后将 HttpResponse,进行组织,然后将 HttpRespons、中数据放入到发送缓冲区当中并启动写事件监控,执行可写事件的回调将发送缓冲区的数据进行发送给客户端,发送完毕后释放连接
小结
该项目就到此结束啦,如果你存在疑问,欢迎在评论区中留言呀