Python 编写简易 HTTP 服务器
什么是 HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是一个应用层协议。准确来说,它是基于 TCP/IP 四层网络模型中传输层的 TCP 协议之上的应用层协议。
在网络通信中,用户的数据是以报文来传输的。在实际通信中,每一层都会对包进行封装,从而形成段、数据报、帧,最后是以比特流(二进制)进行传输。到了目标主机后,会对每一层又进行拆解,从而得到最后的报文。
HTTP 位于最上层,即应用层。它最初被用来传输 Hypertext 文档,因此被称为超文本协议。虽然现在可以传输视频、音频、图片等其他类型的数据,但它依然沿用此名称。
HTTP 报文结构分析
HTTP 报文由四部分组成:起始行、首部行、空白行以及实体(Body)。各部分之间使用 \r\n(CRLF)进行分割。
请求报文格式
在 Linux 中,可以使用 curl -v 网址 命令打印详细的请求信息,其中包括报文内容。
curl -v http://example.com
请求报文格式如下:
- 请求行:指定 HTTP 请求方法(如 GET、POST、HEAD)、URL 路径及协议版本,以 CRLF 结束。
- 首部行:可以有多个,以 (字段名:值) 的方式出现,每个首部行同样以 CRLF 结束。常见的有 User-Agent、Host、Accept 等。
- 空白行:代表 HTTP 报文头结束,接下来是报文主体。
- 实体:请求的主体内容,GET 请求通常为空,POST 请求则包含表单数据或 JSON 等。
响应报文格式
响应报文结构与请求报文类似,主要区别在于第一行:
- 状态行:包含协议版本、状态码(如 200, 301, 404)以及状态短语(如 OK, Moved Permanently)。
- 首部行:告知服务器信息、时间、报文类型(Content-Type)及长度(Content-Length)。
- 空白行:分隔头部与主体。
- 实体:服务器返回的具体内容,如 HTML 代码、JSON 数据或文件流。
使用 Python 手写 HTTP 服务器
HTTP 是基于 TCP 的应用层协议,构建 HTTP 服务器的本质是编写一个 Socket 程序。
基础 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...')
:
:
client_socket, client_address = server_socket.accept()
()
:
data = client_socket.recv().decode()
data:
request_line = data.split()[]
()
response_body =
response_headers =
response =
client_socket.sendall(response.encode())
:
client_socket.close()
KeyboardInterrupt:
()
:
server_socket.close()


