加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

从零实现一个Http服务器

发布时间:2019-04-21 12:07:11 所属栏目:业界 来源:高性能服务器开发
导读:我始终认为,生成的身世很重要,但后天的全力越发重要,以是现在的许多科班每每不如后天全力的非科班。以是,我们必要从头给专业和专家下一个界说:所谓专业,就是别人不搞你搞,这就是你的专业;你和别人同时搞,你比别人搞的好,就是专家。 说到http协议

那么POST的数据放在什么位置呢?我们再12306网站https://kyfw.12306.cn/otn/login/init中登岸输入用户名和暗码:

从零实现一个Http处事器

然后发明赏识器以POST方法组装了http协议包发送了我们的用户名、暗码和其他一些信息,组装的包名目如下:

  1. POST /passport/web/login HTTP/1.1rn 
  2.  2Host: kyfw.12306.cnrn 
  3.  3Connection: keep-alivern 
  4.  4Content-Length: 55rn 
  5.  5Accept: application/json, text/javascript, */*; q=0.01rn 
  6.  6Origin: https://kyfw.12306.cnrn 
  7.  7X-Requested-With: XMLHttpRequestrn 
  8.  8User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36rn 
  9.  9Content-Type: application/x-www-form-urlencoded; charset=UTF-8rn 
  10. 10Referer: https://kyfw.12306.cn/otn/login/initrn 
  11. 11Accept-Encoding: gzip, deflate, brrn 
  12. 12Accept-Language: zh-CN,zh;q=0.9,en;q=0.8rn 
  13. 13Cookie: _passport_session=0b2cc5b86eb74bcc976bfa9dfef3e8a20712; _passport_ct=18d19b0930954d76b8057c732ce4cdcat8137; route=6f50b51faa11b987e576cdb301e545c4; RAIL_EXPIRATION=1526718782244; RAIL_DEVICEID=QuRAhOyIWv9lwWEhkq03x5Yl_livKZxx7gW6_-52oTZQda1c4zmVWxdw5Zk79xSDFHe9LJ57F8luYOFp_yahxDXQAOmEV8U1VgXavacuM2UPCFy3knfn42yTsJM3EYOy-hwpsP-jTb2OXevJj5acf40XsvsPDcM7; BIGipServerpool_passport=300745226.50215.0000; BIGipServerotn=1257243146.38945.0000; BIGipServerpassport=1005060362.50215.0000rn 
  14. 14rn 
  15. 15username=balloonwj%40qq.com&password=iloveyou&appid=otn 

个中username=balloonwj%40qq.com&password=iloveyou&appid=otn就是我们的POST数据,可是各人必要留意的以下几种,不要搞错:

1. 我的用户名是balloonwj@qq.com,到POST内里酿成balloonwj%40qq.com,个中%40是@标记的16进制转码情势。这个码表可以参考这里:http://www.w3school.com.cn/tags/html_ref_urlencode.html

2.这里有三个变量,别离是username、password和appid,他们之间行使&标记支解,可是请留意的是,这不料味着转达多个POST变量时必需行使&标记支解,只不外这里是赏识器html表单(输入用户名和暗码的文本框是html表单的一种)支解多个变量回收的默认方法罢了。你可以按照你的需求,来自由定制,只要让处事器知道你的理会方法即可。好比可以这么支解:

要领一

  1. username=balloonwj%40qq.com|password=iloveyou|appid=otn 

要领二

  1. username:balloonwj%40qq.comrn 
  2. 2password:iloveyourn 
  3. 3appid:otnrn 

要领三

  1. username,password,appid=balloonwj%40qq.com,iloveyou,otn 

不管怎么支解,只要你能本身按必然的法则理会出来就可以了。

不知道你留意到没有,上面的POST数据放在http包体中,处事器怎样理会呢?也许你没大白我的意思,看下图:

从零实现一个Http处事器

如上图所示,因为http协议是基于tcp协议的,tcp协议是流式协议,包头部门可以通过多出的rn来分界,包体部门怎样分界呢?这是协议自己要办理的题目。今朝一样平常有两种方法,第一种方法就是在包头中有个content-Length字段,这个字段的值的巨细标识了POST数据的长度,上图中55就是数据username=balloonwj%40qq.com&password=iloveyou&appid=otn的长度,处事器收到一个数据包后,先从包头理会出这个字段的值,再按照这个值去读取响应长度的作为http协议的包体数据。尚有一个名目叫做http chunked技能(分块),大抵意思是将大包分成小包,详细的详情有乐趣的读者可以自行搜刮进修。

三、http客户端实现

假如您能把握以上说的http协议,你就可以本身通过代码组装http协议发送http哀求了(也是各类开源http库的做法)。我们先简朴地先容一下怎样模仿发送http。举个例子,我们要哀求http://www.hootina.org/index_2013.php,那么我们可以先通过域名获得ip地点,即通过socket API gethostbyname()获得www.hootina.org的ip地点,因为http处事器默认的端标语是80,有了域名和ip地点之后,我们行使socket API connect()去毗连处事器,然后按照上面先容的名目组装成http协议包,操作socket API send()函数发出去,假如处事器有应答,我们可以行使socket API recv()去接管数据,接下来就是理会数据(先理会包头和包体)。

四、http处事器实现

(编辑:湖南网)

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

热点阅读