muduo httpServer原理以及使用
为什么要加个httpServer ?
因为之前做校园猫管理平台的时候,底层用的就是这个之前学习做的tinyMuduo.
但是由于时间紧张,当时只是client和server裸发送json字符串,没有使用正经的应用层协议,遂在期末结束后给原先光秃秃的tcp server加一层http.
基本都是看完Muduo之后默着写 然后再改的。。
不难,就是string处理琐碎烦人.
相关类及使用
http部分就是基于tcp server之上,增加了几个内置的类和回调函数.是对tcpServer的使用. http部分负责解析http请求以及生成响应。并提供给用户注册回调函数的接口.
- 用户负责注册的callback : 针对不同url以及method等 返回资源(实体体)和生成响应码(状态行),以及首部行. 实现的HTTPServer会帮助user将response存入Buffer并发送出去
muduo http类图
相关类
- HTTPContext : FSM解析http request
- HTTPRequest : 解析后的request信息存在这里
- HTTPResponse : user向其中写入要发送的信息,然后http server会序列化到buf中,最后send出去.
- HTTPServer:
- void HttpServer::onMessage(const TcpConnectionPtr& conn, Buffer* buf,Timestamp receiveTime)
- 解析http请求,调用user的callback(httpCallback_),发送生成的response.
- void HttpServer::onMessage(const TcpConnectionPtr& conn, Buffer* buf,Timestamp receiveTime)
user使用很简单
- 只需注册一个respond即可. 该callback负责根据已经解析好的http request 填充http response
- 只需注册一个respond即可. 该callback负责根据已经解析好的http request 填充http response
更多注释见代码
http
http请求报文格式
- 每行的末尾都是\r\n ; 首部行和实体体之间有一行\r\n
- 网上又将首部行称为请求头,实体体称为请求体
1
2
3
4
5
6请求行 requestline : GET /hello.txt HTTP/1.1\r\n
首部行 headerline : User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3\r\n
首部行 headerline : Host: www.example.com\r\n
首部行 headerline : Accept-Language: en, mi\r\n
\r\n
实体体 entity body
http响应报文格式
- 每行的末尾都是\r\n ; 首部行和实体体之间有一行\r\n
- 网上又将状态行称为响应行, 首部行称为响应头 , 实体体称为响应体
1
2
3
4
5
6
7
8状态行 statusline : HTTP/1.1 200 OK\r\n
首部行 headerline : Content-Encoding: gzip\r\n
首部行 headerline : Content-Type: text/html\r\n
首部行 headerline : Date: Thu, 16 Jul 2020 06:45:26 GMT\r\n
首部行 headerline : Content-Length: 78\r\n
首部行 headerline : Connection: keep-alive\r\n
\r\n
实体体 entity body : <div><div id="__status">0</div><div id="__redirect">0</div><div id="__switchtime">0</div></div>
压测
- 2核4G腾讯云服务器. Server设置1个mainReactor,1个subReactor
应该是由于网络原因,比Server在本地测试慢很多.本地压测能达到十万.
- 2核4G腾讯云服务器. Server设置1个mainReactor,1个subReactor