不落辰

知不可乎骤得,托遗响于悲风

0%

muduo-http

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.
  • user使用很简单

    • 只需注册一个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在本地测试慢很多.本地压测能达到十万.