python|写一个简单的http服务器

简介: python|写一个简单的http服务器

本篇文章的python版本为:

image.png


什么是http


http是一个应用层协议,准确的来说是基于TCP/IP4层网络协议中的传输层中的TCP应用层协议。

额,4层模型大概是这样的:

image.png

在网络通信中,用户的数据是以报文来传输的,但是在实际通信中,每一层都会对包进行封装,从而形成段、数数据报、帧,最后是以比特流(二进制)进行传输,到了目标主机后,会对每一层又进行拆解,从而得到最后的报文。


http就在最上层,就是应用层那里。


http到底离我们多近呢? 甚至于你现在看到的文章,使用的就是http协议,它还有一个名字,叫做超文本传输协议,为什么叫超文本呢? 因为最开始的是时候,http是被用来传输Hypertext文档的,所以被叫做超文本协议,当然现在可以传输其他类型的数据,如: 视频、音频、图片等,但是它依然被称之为超文本协议。


很难理解吧,没关系,继续往下看。




分析http请求报文和响应报文格式


通过上面的简介,我们知道http是应用层协议,它在网络协议中,是被称之为报文的,让我们来看一下http的请求报文 和 响应报文吧。


http报文由4部分组成,分别是起始行、首部行、空白行 以及 实体组成。以\r\n(也称之为CRLF)进行分割。


让我们来看一下实际的报文呢。


linux中,我们可以使用curl -v 网址来打印详细的请求信息,其中就包括了报文。


命令:

curl -v http://juejin.cn

请求信息:

image.png



其中输出的结果中> 代表我们发出的报文,而< 代表服务器发送给我们的响应信息。下面我们将结合报文来看上面的数据信息。

请求报文格式如下:

image.png


其中请求行会指定http的请求方法,如: GETPOSTHEAD等, URL则是请求的文件路径,协议版本需要指定http的版本,最后是以CRLF结束。


首部行可以有多个,以 (字段名: 值) 的方式出现,每一个首部行同样是以CRLF结束。


而后是空行。空行则代表http报文头结束了,接下来该是发送的报文主体了,接下来,我们将上述请求http://juejin.cn的例子,填入表格来看下:


image.png

上述是我们使用curl工具请求的http://juejin.cn请求报文整体形式,我们可以看到,我们使用了GET方法,获取服务器的/信息,使用的协议是HTTP/1.1,而后携带了3个首部行,分别是User-AgentHost以及Accept


响应报文格式如下:

image.png


将响应报文和请求报文进行对比,我们不难发现,除了第一行以外,其他的格式都是一样的,所以,我们仅介绍响应行的信息,在响应报行中,第一个是协议的版本,这个是服务器的协议版本,而后便是状态码,用于告知客户端,服务器响应的信息,最后是短语,短语的作用是告知使用者,这个返回信息大概是什么意思。


好了,我们将上述juejin.cn响应给我们的报文,我们填到表格中呢:

image.png


上述是我们使用curl请求http://juejin.cn/,服务器返回的信息,我们逐行来看下,响应行,告知了我们http版本是HTTP/1.1,状态码是301,短语是 链接被转移了。


上述我们若仅通过状态码的话,是很难get到整个报文的意思的,不过有短语,就可以猜一下了。


首部行,告知了我们服务器 、时间 、 报文类型 以及 报文长度。还记得我们第一段落介绍过得,http现在除了发送超文本以外,还可以发送图片、视频等,就是通过首部行Content-Type来确定的。


接着是空白行,最后是报文主体,哎,有没有感觉奇怪呢?为什么请求报文主体是空的呢?这是因为报文主体长度是由首部行Content-Length来定义的,如上报文展示的是,我们报文主体有262个字符。



手写一个简单的http服务器


上述,我们介绍了,什么是http以及初略的看了一下 http的请求报文和响应报文,那么,我们如何构建一个http服务器呢?


我们知道,http是应用层协议,是基于传输层tcp来实现的,所以,我们若想构建一个http服务器,那么应该写一个socket程序出来吧。

image.png

上述,我们写了一个tcp程序,它将监听本地回环地址的8080端口,若此时我们使用curl -v 127.0.0.1:8080请求一下该接口,我们将会得到请求报文了,如下:

image.png

我们得到请求报文后,可以构建一个响应报文发送回去,例如: Hello, Destined Person.,我们就可以这样来构建http 请求报文信息:

image.png


最后我们使用curl再来测试一下,是可以得到消息的。


image.png



总结


该篇文章,我们仅介绍了什么是httphttp的请求报文以及响应报文,最后我们使用python,创建了一个tcp服务器来发送响应客户的响应报文。总体而言,http的报文还是非常简单的。我们只是写了一个非常简单的http服务器,其实在python中,web是有一个标准的,它称之为WSGI,哎,扯远了。







相关文章
|
9月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
2048 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
8月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
1399 1
|
9月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
9月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
2244 0
|
9月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
604 0
|
6月前
|
弹性计算 运维 安全
阿里云轻量应用服务器与云服务器ECS啥区别?新手帮助教程
阿里云轻量应用服务器适合个人开发者搭建博客、测试环境等低流量场景,操作简单、成本低;ECS适用于企业级高负载业务,功能强大、灵活可扩展。二者在性能、网络、镜像及运维管理上差异显著,用户应根据实际需求选择。
490 10
|
6月前
|
运维 安全 Ubuntu
阿里云渠道商:服务器操作系统怎么选?
阿里云提供丰富操作系统镜像,涵盖Windows与主流Linux发行版。选型需综合技术兼容性、运维成本、安全稳定等因素。推荐Alibaba Cloud Linux、Ubuntu等用于Web与容器场景,Windows Server支撑.NET应用。建议优先选用LTS版本并进行测试验证,通过标准化镜像管理提升部署效率与一致性。
|
6月前
|
弹性计算 ice
阿里云4核8g服务器多少钱一年?1个月和1小时价格,省钱购买方法分享
阿里云4核8G服务器价格因实例类型而异,经济型e实例约159元/月,计算型c9i约371元/月,按小时计费最低0.45元。实际购买享折扣,1年最高可省至1578元,附主流ECS实例及CPU型号参考。
636 8
|
6月前
|
存储 监控 安全
阿里云渠道商:云服务器价格有什么变动?
阿里云带宽与存储费用呈基础资源降价、增值服务差异化趋势。企业应结合业务特点,通过阶梯计价、智能分层、弹性带宽等策略优化成本,借助云监控与预算预警机制,实现高效、可控的云资源管理。
|
6月前
|
弹性计算 运维 安全
区别及选择指南:阿里云轻量应用服务器与ECS云服务器有什么区别?
阿里云轻量应用服务器适合个人开发者、学生搭建博客、测试环境,易用且性价比高;ECS功能更强大,适合企业级应用如大数据、高流量网站。根据需求选择:轻量入门首选,ECS专业之选。
424 2