Python 编写简易 HTTP 服务器
什么是 HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是一个应用层协议。准确来说,它是基于 TCP/IP 四层网络模型中传输层的 TCP 协议之上的应用层协议。
HTTP 协议是应用层协议,基于 TCP 实现,负责传输超文本及其他数据。HTTP 报文由起始行、首部行、空白行和实体组成,分为请求和响应两种格式。本文详细解析了报文结构,并使用 Python Socket 编程实现了基础的 HTTP 服务器,展示了 bind、listen、accept、recv 和 sendall 等关键 API 的使用。同时对比了标准库 http.server 及 WSGI 标准,说明了从底层原理到生产环境框架的演进关系。

HTTP(HyperText Transfer Protocol,超文本传输协议)是一个应用层协议。准确来说,它是基于 TCP/IP 四层网络模型中传输层的 TCP 协议之上的应用层协议。
在网络通信中,用户的数据是以报文来传输的。在实际通信中,每一层都会对包进行封装,从而形成段、数据报、帧,最后是以比特流(二进制)进行传输。到了目标主机后,会对每一层又进行拆解,从而得到最后的报文。
HTTP 位于最上层,即应用层。它最初被用来传输 Hypertext 文档,因此被称为超文本协议。虽然现在可以传输视频、音频、图片等其他类型的数据,但它依然沿用此名称。
HTTP 报文由四部分组成:起始行、首部行、空白行以及实体(Body)。各部分之间使用 \r\n(CRLF)进行分割。
在 Linux 中,可以使用 curl -v 网址 命令打印详细的请求信息,其中包括报文内容。
curl -v http://example.com
请求报文格式如下:
响应报文结构与请求报文类似,主要区别在于第一行:
HTTP 是基于 TCP 的应用层协议,构建 HTTP 服务器的本质是编写一个 Socket 程序。
以下是一个简单的 Python TCP 服务器示例,监听本地回环地址的 8080 端口,并处理客户端请求。
import socket
# 创建 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用,避免重启时报错
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定地址和端口
server_address = ('127.0.0.1', 8080)
server_socket.bind(server_address)
# 开始监听
server_socket.listen(5)
print('Server listening on port 8080...')
try:
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f'Connection from {client_address}')
try:
# 接收客户端请求数据
data = client_socket.recv(1024).decode('utf-8')
if not data:
continue
# 解析请求行(简单示例)
request_line = data.split('\r\n')[0]
print(f'Request: {request_line}')
# 构建 HTTP 响应
response_body = 'Hello, Destined Person.'
response_headers = f'Content-Length: {len(response_body)}\r\nContent-Type: text/plain; charset=utf-8'
response = f'HTTP/1.1 200 OK\r\n{response_headers}\r\n\r\n{response_body}'
# 发送响应
client_socket.sendall(response.encode('utf-8'))
finally:
# 关闭客户端连接
client_socket.close()
except KeyboardInterrupt:
print('Shutting down server...')
finally:
server_socket.close()
启动上述脚本后,可以在终端使用 curl 进行测试:
curl -v http://127.0.0.1:8080
如果配置正确,将看到服务器返回的 HTTP 200 状态码及自定义消息。
虽然手动编写 Socket 服务器有助于理解原理,但在实际开发中,我们通常使用成熟的 Web 框架或标准库。
http.server 模块,可以快速搭建一个简单的 HTTP 服务器用于静态文件服务。
python -m http.server 8000
本文介绍了 HTTP 协议的基本概念、请求与响应报文的结构,并通过 Python Socket 编程演示了如何构建一个简单的 HTTP 服务器。通过对比原始 Socket 实现与标准库及框架的差异,可以看出底层原理与上层抽象之间的关系。掌握这些基础知识,有助于深入理解网络编程及 Web 开发的运行机制。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online