基于python 自己动手写一个简单的web服务器

1. 前言

如今一提到服务器首先就想到 apache tomcat nginx等。虽然这些服务器很优秀。但是对于我们平时拿来练手的一些小项目来说却是大材小用,杀鸡用牛刀,而且上述主流服务器配置起来也略嫌麻烦。俗话说自己动手丰衣足食,今天我们就来实现一个简单的静态web服务器。

2. http协议

谈到浏览器,服务器时,作为计算机爱好者,首先想到的就是www、http、https、html等等,那我们就先来了解一下http协议。

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。http协议是一个基于tcp的应用层协议 ,

简单来说当我们在浏览器里输入一个网址访问网页时,就是在使用http协议,比如我们访问 baidu ,当你在浏览器里输入 ‘www.baidu.com’ 后按下回车时,浏览器会自动判断并补全协议 如下图(此处不深究)
在这里插入图片描述
在这里插入图片描述
那么问题来了,当我们输入www.baidu.com 时浏览器向百度的服务器发送了什么内容呢? 接下来我们借助 “网络调试助手” 来模拟一次浏览器向服务器请求和服务器应答的过程。

网络调试助手基本配置如下图:
在这里插入图片描述

我在这里选择了127.0.0.1本机回环地址,端口8080 为大家演示

  1. 配置好后点击连接。

  2. 然后打开浏览器输入 http://127.0.0.1:8080
    在这里插入图片描述
    我们看到小圈圈在转,说明正在请求

  3. 回到网络调试助手,发现在网络数据接受区出现如下内容
    在这里插入图片描述
    4.紧接着我们在发送区输入 HTTP/1.1 200 OK 回车,空一行后 继续输入HelloWorld 点击发送,点击断开,然后返回浏览器,发现小圈圈停止了转动,并在页面显示出了HelloWorld

在这里插入图片描述

在这里插入图片描述
5.这就是浏览器也与服务器之间一次简单的请求,应答

一、 http协议请求部分

我们在浏览器打开调试器,重复上述操作,得到如下结果

在这里插入图片描述

在这里插入图片描述
对比上述红色部分不难看出他们是相同的,而在网络调试助手中的第一句 GET / HTTP/1.1在这三部分中 我们也可以在浏览器的调试器中找到类似的。

  1. 如GET 对应 请求方法:GET,
  2. ‘/’ 对应状态代码中最后的 ‘/’ ,以及请求url中最后的‘/’。/ 在这里代表的是访问html在服务器中的路径
  3. 最后的HTTP/1.1则是HTTP的版本号,比如现在我们使用的就是第1.1个版本

在http协议的请求中: 请求方法 路径 版本号 是构成协议的最基本的,最简单的 也是必须要有的三部分

观察网络调试助手中收到的信息,除了 GET / HTTP/1.1 之外还有一堆东西是怎么来的呢有什么用呢?

其实,剩下的这部分是浏览器根据自身的情况自动生成的,如:

  1. User-Agent:xxxxxxxxxxxx 这代表访问当前页面使用的浏览器是哪个,以及此浏览器的内核信息等。
  2. Accept-Language:xxxxxxx 请求头允许客户端声明它可以理解的自然语言,简单说就是浏览器可以识别的语言。

其余的这里就不一一介绍了,但我们可以发现一个规律,就是剩下的这部分都是以 “xxx : xxx” 格式存在的。其实这也是http协议所规定的。

现在我们就可以完整的得出http协议在请求时的格式规定:

  1. 第一行必须是 请求方法 路径 版本号
  2. 其余信息皆以 xxx : xxx 的格式 各占一行

二、 http协议响应部分

明白了请求我们接着看看服务器是如何响应浏览器的请求,又是发送了哪些数据给浏览器呢?

之前使用网络调试助手模拟应答时,在发送框内输入了 HTTP/1.1 200 OK 回车 空行后 又输入HelloWorld ,但是浏览器却只

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值