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

从零实现一个Http处事器

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

我始终认为,生成的身世很重要,但后天的全力越发重要,以是现在的许多“科班”每每不如后天全力的“非科班”。以是,我们必要从头给“专业”和“专家”下一个界说:所谓专业,就是别人不搞你搞,这就是你的“专业”;你和别人同时搞,你比别人搞的好,就是“专家”。

说到http协媾和http哀求,许多人都知道,可是他们真的“知道”吗?我口试过许多求职者,一说到http协议,他们能滚滚一直,然后我问他http协议的详细名目是啥样子的?许多人不清晰,不清晰就不清晰吧,他乃至能将http协议的托亩到html文档头部。当我问http GET和POST哀求的时辰,GET哀求是什么情势一样平常人都可以答出来,可是POST哀求的数据放在那边,处事器怎样辨认息争析这些POST数据,许多人又说不清道不明白。当说到http处事器时,许多人分开了apache、Nginx这样现成的http server之外,本身实现一个http处事器无从动手,假如现实应用场景有必要行使到一些简朴http哀求时,行使apache、Nginx这样重量级的http处事器措施其实劳师动众,你可以实行本身实现一个简朴的。

从零实现一个Http处事器

上面提到的题目,假如您不能清楚地答复出来,可以阅读一下这篇文章,这篇文章在不只先容http的名目,同时教育各人从零实现一个简朴的http处事器措施。

一、项目配景

最近许多伴侣但愿我的flamingo处事器支持http协议,我本身也想做一个微信小措施,小措施通过http协议毗连通过我的flamingo处事器举办谈天。flamingo是一个开源的即时通信软件,今朝除了处事器端,尚有pc端、android端,后头会支持更多的终端。关于flamingo的先容您可以参考这里:(七)开源一款即时通信软件的源码,这是我不绝维护一个项目,其最新代码下载地点是:https://github.com/baloonwj/flamingo,更新日记:https://github.com/baloonwj/flamingo/issues/1。下面是flamingo的部门截图:

从零实现一个Http处事器

二、http协议先容

1. http协议是应用层协议,一样平常成立在tcp协议的基本之上(虽然你的实现非要基于udp也是可以的),也就是说http协议的数据收发是通过tcp协议的。

2. http协议也分为head和body两部门,可是我们一样平常说的html中的和标志不是http协议的头和身材,它们都是http协议的body部门。

从零实现一个Http处事器

那么http协议的头到底长啥样子呢?我们来先容一下http协议吧。

http协议的名目如下:

  1. 1GET或POST 哀求的url路径(一样平常是去掉域名的路径) HTTP协议版本号rn 
  2. 2字段1名: 字段1值rn 
  3. 3字段2名: 字段2值rn 
  4. 4     … 
  5. 5字段n名 : 字段n值rn 
  6. 6rn 
  7. 7http协议包体内容 

也就是说http协议由两部门构成:包头和包体,包头与包体之间行使一个rn支解,因为http协议包头的每一行都是以rn竣事,以是http协议包头一样平常以rnrn竣事。

举个例子,好比我们在赏识器中哀求http://www.hootina.org/index_2013.php这个网址,这是一个典范的GET要领,赏识器组装的http数据包名目如下:

  1. GET /index_2013.php HTTP/1.1rn 
  2. 2Host: www.hootina.orgrn 
  3. 3Connection: keep-alivern 
  4. 4Upgrade-Insecure-Requests: 1rn 
  5. 5User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36rn 
  6. 6Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8rn 
  7. 7Accept-Encoding: gzip, deflatern 
  8. 8Accept-Language: zh-CN,zh;q=0.9,en;q=0.8rn 
  9. 9rn 

上面这个哀求只有包头没有包体,http协议的包体不是必需的,也就是说GET哀求一样平常没有包体。

假如GET哀求带参数,那么一样平常是附加在哀求的url后头,参数与参数之间行使&支解,譬喻哀求http://www.hootina.org/index_2013.php?param1=value1¶m2=value2¶m3=value3,我们看下这个哀求组装的的http协议包名目:

  1. GET /index_2013.php?param1=value1&param2=value2&param3=value3 HTTP/1.1rn 
  2. 2Host: www.hootina.orgrn 
  3. 3Connection: keep-alivern 
  4. 4Upgrade-Insecure-Requests: 1rn 
  5. 5User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36rn 
  6. 6Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8rn 
  7. 7Accept-Encoding: gzip, deflatern 
  8. 8Accept-Language: zh-CN,zh;q=0.9,en;q=0.8rn 
  9. 9rn 

比拟一下,你此刻知道http协议的GET参数放在协议包的什么位置了吧。

(编辑:河北网)

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

热点阅读