基于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
猜你喜欢
- 一、base64模块base64模块提供了在二进制数据和可打印ASCII字符间编解码的功能,包括 RFC3548中定义的Base16, Ba
- Vue给数组第一位添加对象数据核心代码如下: this.menuBar.unshift({
- 1.安装mockjs和vite-plugin-mocknpm i mockjs vite-plugin-mock --save-dev2.在
- js代码:$(".head").change(function() {var val = $(this).val();i
- 将有安全问题的SQL过程删除.比较全面.一切为了安全!删除了调用shell,注册表,COM组件的破坏权限MS SQL SERVER2000使
- 为方便维护和实现开放性,我把调查的好几个主题都放到同一个数据库的同一个表名当中去了但问题是在查询其中一个调查主题时,往往还会显示不相关主题的
- 本文实例讲述了Django框架自定义session处理操作。分享给大家供大家参考,具体如下:django有自己的一套session框架,有他
- 1、冒泡排序它反复访问要排序的元素列,并依次比较两个相邻的元素。如果顺序(如从大到小)错了,就交换它们。访问元素的工作是反复进行,直到没有相
- 本文实例讲述了Python实现的列表排序、反转操作。分享给大家供大家参考,具体如下:排序:使用sorted方法和列表的sort方法:sort
- 如何快速的复制一张表首先创建一张表db1.t,并且插入1000行数据,同时创建一个相同结构的表db2.t假设,现在需要把db1.t里面的a&
- 核心代码:#!/usr/bin/python#-*- coding:gbk -*-#设置源文件输出格式import sysimport ge
- create proc addcolumn@tablename varchar(30), --表名@colname varchar(30),
- 本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下。这次要爬的站点是这个:http://www.weather.com.cn/
- 原来字母还可以组合成各种动物图案,真是佩服设计师的奇思妙想,很可爱,超级有趣的组合!Bembo's Zoo 猴子:羊是牛吗,勤劳的水
- 前几天有个人退群了。起因很简单,他问了一个问题,没人回答,于是说要退群,后来我看到了,给了个链接,说这个问题已经说过好多遍了,于是他就退了。
- 网上有很多方法能够过去到IP地址归属地的脚本,但是我发现淘宝IP地址库的信息更详细些,所以用shell写个脚本来处理日常工作中一些IP地址分
- 这里我不讨论 python 的一些有用的库或者框架,只从语言本身,最小支持的情况下谈论这门语言本身。语言的发展都是越来越接近Lisp,这也是
- 本文实例讲述了javascript中createElement的两种创建方式。分享给大家供大家参考。具体实现方法如下:<html xm
- 1、环境PyCharmPython 3.6pip安装的依赖包包括:requests 2.25.0、urllib3 1.26.2、docx 0
- 对于想深入理解 Python 的朋友,很有必要认真看看。喜欢本文点赞支持,欢迎收藏学习。1. eval函数函数的作用:计算指定表达式的值。也