基于Python编写一个简单的http服务器
作者:真的不能告诉你我的名字 发布时间:2022-04-08 21:07:39
本篇文章的python
版本为:
什么是http
http
是一个应用层协议,准确的来说是基于TCP/IP
4层网络协议中的传输层中的TCP
应用层协议。
额,4层模型大概是这样的:
在网络通信中,用户的数据是以报文来传输的,但是在实际通信中,每一层都会对包进行封装,从而形成段、数数据报、帧,最后是以比特流(二进制)进行传输,到了目标主机后,会对每一层又进行拆解,从而得到最后的报文。
http
就在最上层,就是应用层那里。
http
到底离我们多近呢? 甚至于你现在看到的文章,使用的就是http
协议,它还有一个名字,叫做超文本传输协议,为什么叫超文本呢? 因为最开始的是时候,http
是被用来传输Hypertext
文档的,所以被叫做超文本协议,当然现在可以传输其他类型的数据,如: 视频、音频、图片等,但是它依然被称之为超文本协议。
很难理解吧,没关系,继续往下看。
分析http请求报文和响应报文格式
通过上面的简介,我们知道http
是应用层协议,它在网络协议中,是被称之为报文的,让我们来看一下http
的请求报文 和 响应报文吧。
http
报文由4部分组成,分别是起始行、首部行、空白行 以及 实体组成。以\r\n
(也称之为CRLF
)进行分割。
让我们来看一下实际的报文呢。
在linux
中,我们可以使用curl -v 网址
来打印详细的请求信息,其中就包括了报文。
命令:
curl -v http://juejin.cn
请求信息:
其中输出的结果中>
代表我们发出的报文,而<
代表服务器发送给我们的响应信息。下面我们将结合报文来看上面的数据信息。
请求报文格式如下:
其中请求行会指定http
的请求方法,如: GET
、POST
、HEAD
等, URL
则是请求的文件路径,协议版本需要指定http
的版本,最后是以CRLF
结束。
首部行可以有多个,以 (字段名: 值) 的方式出现,每一个首部行同样是以CRLF
结束。
而后是空行。空行则代表http
报文头结束了,接下来该是发送的报文主体了,接下来,我们将上述请求http://juejin.cn
的例子,填入表格来看下:
上述是我们使用curl
工具请求的http://juejin.cn
请求报文整体形式,我们可以看到,我们使用了GET
方法,获取服务器的/
信息,使用的协议是HTTP/1.1
,而后携带了3个首部行,分别是User-Agent
、Host
以及Accept
。
响应报文格式如下:
将响应报文和请求报文进行对比,我们不难发现,除了第一行以外,其他的格式都是一样的,所以,我们仅介绍响应行的信息,在响应报行中,第一个是协议的版本,这个是服务器的协议版本,而后便是状态码,用于告知客户端,服务器响应的信息,最后是短语,短语的作用是告知使用者,这个返回信息大概是什么意思。
来源:https://juejin.cn/post/7225623397145116732
猜你喜欢
- 从2003年到现在,从ACCESS到SQL SERVER的使用。在ACCESS中没有存储过程的概念。在使用过程中,发现ACCESS与SQL
- 本文实例讲述了Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能。分享给大家供大家参考,具体如下:因为需要使用
- 引言第一次了解python的WSGI,可能描述的不太准确。本篇文章所依赖的python环境为:什么是WSGIWSGI也称之为web服务器通用
- PHP使用星号替代用户名手机和邮箱这个在许多的活动界面会看到如淘宝的购物界面中的一些客户的支付宝号都是隐藏掉的哦,下面我们来看一下它的使用方
- 本文实例讲述了Python实现清理微信僵尸粉功能。分享给大家供大家参考,具体如下:原理通过Pyhton调用itchat模块登录网页版微信,给
- 学习vue和nodejs的过程当中,涉及到了axios,今天为了测试,写了get和post两个方法来跟node服务端交互,结果因为heade
- 要说2017年什么技术最火爆,无疑是google领衔的深度学习开源框架Tensorflow。本文简述一下深度学习的入门例子MNIST。深度学
- 微博如火如荼,大家都选择用微博带来社会化流量,顺便推广产品和网站,几乎所有的网站都有分享到代码,但是还有一种更快捷的分享方式,javascr
- 简介bisect 库是 Python 标准库中的一部分,它提供了二分查找的功能。二分查找是一种在有序列表中查找某一特定元素的搜索算法。它的时
- 在linux服务器lvs负载均衡、双机热备应用中经常用到mysql双机热备,安装和配置过程如下:一、 安装MYSQL# cp mysql-s
- 学习前言最近在学目标检测……SSD的源码好复杂……看
- json数据:[{"authenticate":-99,"last_ip":"156.2.
- Django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。方便的是,django可以自动生成这些cr
- 一、利用webbrowser.open()打开一个网站:>>> import webbrowser >>>
- UCHOME的代码还是很不错的,学习一下! <?php /** * 定义一些常量 */ @define('IN_UCHOME&
- 1、概述在前面的文章中,我有分享了vue+drf+第三方滑动验证码接入的实现 (文中也留了分享图片验证码功能的实现),即本文将要分享的是基于
- 有时候想为我们的网页提供多语言支持,如果一种语言用一张网页来做实在太麻烦了,幸好Google提供了语言工具功能,下面介绍如何利用它来实现网页
- 如果中间红色区域是针则可以用下面的代码检测,其阈值和斑点检测的参数根据图像像素值做相应修改检测的主要思路是先通过找到外面的大圆,再通过圆心定
- Background高斯噪声,顾名思义是指服从高斯分布(正态分布)的一类噪声。有的时候我们需要向标准数据中加入合适的高斯噪声让数据更加符合实
- 一、绑定方法1.对象的绑定方法首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的。下面,我们通过实例,来慢慢解析绑