设为首页 - 加入收藏 桂林站长网 (http://www.0773zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: wifi 系统 2019 英伟
当前位置: 首页 > 七星图 > 外闻 > 正文

从零实现一个Http服务器

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

我始终觉得,天生的出身很重要,但后天的努力更加重要,所以如今的很多“科班”往往不如后天努力的“非科班”。所以,我们需要重新给“专业”和“专家”下一个定义:所谓专业,就是别人不搞你搞,这就是你的“专业”;你和别人同时搞,你比别人搞的好,就是“专家”。

说到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协议版本号\r\n?
  2. 2字段1名:?字段1值\r\n?
  3. 3字段2名:?字段2值\r\n?
  4. 4?????…?
  5. 5字段n名?:?字段n值\r\n?
  6. 6\r\n?
  7. 7http协议包体内容?

也就是说http协议由两部分组成:包头和包体,包头与包体之间使用一个\r\n分割,由于http协议包头的每一行都是以\r\n结束,所以http协议包头一般以\r\n\r\n结束。

举个例子,比如我们在浏览器中请求http://www.hootina.org/index_2013.php这个网址,这是一个典型的GET方法,浏览器组装的http数据包格式如下:

  1. GET?/index_2013.php?HTTP/1.1\r\n?
  2. 2Host:?www.hootina.org\r\n?
  3. 3Connection:?keep-alive\r\n?
  4. 4Upgrade-Insecure-Requests:?1\r\n?
  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.36\r\n?
  6. 6Accept:?text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n?
  7. 7Accept-Encoding:?gzip,?deflate\r\n?
  8. 8Accept-Language:?zh-CN,zh;q=0.9,en;q=0.8\r\n?
  9. 9\r\n?

上面这个请求只有包头没有包体,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¶m2=value2¶m3=value3?HTTP/1.1\r\n?
  2. 2Host:?www.hootina.org\r\n?
  3. 3Connection:?keep-alive\r\n?
  4. 4Upgrade-Insecure-Requests:?1\r\n?
  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.36\r\n?
  6. 6Accept:?text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n?
  7. 7Accept-Encoding:?gzip,?deflate\r\n?
  8. 8Accept-Language:?zh-CN,zh;q=0.9,en;q=0.8\r\n?
  9. 9\r\n?

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

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章