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

从零实现一个Http服务器

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

(编辑:好传媒网)

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

热点阅读