加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

从零实现一个Http服务器

发布时间:2019-04-18 06:44:41 所属栏目:外闻 来源:高性能服务器开发
导读:我始终觉得,天生的出身很重要,但后天的努力更加重要,所以如今的很多科班往往不如后天努力的非科班。所以,我们需要重新给专业和专家下一个定义:所谓专业,就是别人不搞你搞,这就是你的专业;你和别人同时搞,你比别人搞的好,就是专家。 说到http协议

代码注释都写的很清楚,我们先利用rn分割得到每一行,其中第一行的数据是:

  1. GET /register.do?p={%22username%22:%20%2213917043329%22,%20%22nickname%22:%20%22balloon%22,%20%22password%22:%20%22123%22} HTTP/1.1 

其中%22是双引号的url转码形式,%20是空格的url转码形式,然后我们根据空格分成三段,其中第二段就是我们的网址和参数:

  1. /register.do?p={%22username%22:%20%2213917043329%22,%20%22nickname%22:%20%22balloon%22,%20%22password%22:%20%22123%22} 

然后我们根据网址与参数之间的问号将这个分成两段:第一段是网址,第二段是参数:

  1. 1bool HttpSession::Process(const std::shared_ptr<TcpConnection>& conn, const std::string& url, const std::string& param) 
  2.  2{ 
  3.  3    if (url.empty()) 
  4.  4        return false; 
  5.  5 
  6.  6    if (url == "/register.do") 
  7.  7    { 
  8.  8        OnRegisterResponse(param, conn); 
  9.  9    } 
  10. 10    else if (url == "/login.do") 
  11. 11    { 
  12. 12        OnLoginResponse(param, conn); 
  13. 13    } 
  14. 14    else if (url == "/getfriendlist.do") 
  15. 15    { 
  16. 16 
  17. 17    } 
  18. 18    else if (url == "/getgroupmembers.do") 
  19. 19    { 
  20. 20 
  21. 21    } 
  22. 22    else 
  23. 23        return false; 
  24. 24 
  25. 25 
  26. 26    return true; 
  27. 27} 

然后我们根据url匹配网址,如果是注册请求,会走注册处理逻辑:

  1. void HttpSession::OnRegisterResponse(const std::string& data, const std::shared_ptr<TcpConnection>& conn) 
  2.  2{ 
  3.  3    string retData; 
  4.  4    string decodeData; 
  5.  5    URLEncodeUtil::Decode(data, decodeData); 
  6.  6    BussinessLogic::RegisterUser(decodeData, conn, false, retData); 
  7.  7    if (!retData.empty()) 
  8.  8    { 
  9.  9        std::string response; 
  10. 10        URLEncodeUtil::Encode(retData, response); 
  11. 11        MakeupResponse(retData, response); 
  12. 12        conn->send(response); 
  13. 13 
  14. 14        LOG_INFO << "Response to client: cmd=msg_type_register" << ", data=" << retData << conn->peerAddress().toIpPort();; 
  15. 15    } 
  16. 16} 

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读