Python实现静态Web服务器:HTTP协议解析与代码实战

方予
方予
发布时间:2026-10-14| 6人浏览过
原创

本文深入解析HTTP协议的工作机制,详细拆解GET与POST请求及响应的Header与Body结构,并结合Python Socket编程实现一个完整的静态Web服务器。通过代码示例展示如何解析HTTP请求、处理文件资源返回及错误处理,帮助开发者理解Web服务底层原理。

HTTP协议基础与工作流程

HTTP协议简介

HTTP请求

第一步:浏览器向服务器发起HTTP请求,该请求主要包含以下要素:

请求方法:区分GET与POST,其中GET用于单纯请求资源,而POST则附带用户提交的数据; 请求路径:格式为/full/url/path; 域名信息:通过Host头指定,例如Host: www.sina.com,同时包含其他相关Header; 若为POST请求,请求体Body中还将包含具体的用户数据。

第二步:服务器向浏览器返回HTTP响应,响应内容包含:

状态码:200代表成功,3xx系列表示重定向,4xx系列表明客户端请求存在错误,5xx系列则代表服务器端处理出错; 内容类型:由Content-Type头指定; 其他相关Header; 通常HTTP响应会携带Body,即响应的具体内容,网页的HTML源码即存储于Body中。

第三步:若浏览器需继续请求其他资源(如图片),将再次发起HTTP请求,重复上述步骤1和2。

Web采用的HTTP协议遵循简单的请求-响应模式,极大简化了开发流程。编写页面时,只需在HTTP请求中发送HTML,无需考虑图片、视频等资源的附带;若浏览器需要请求图片或视频,会单独发送另一个HTTP请求。因此,一个HTTP请求仅处理一个资源(可类比为TCP协议中的短连接,每个链接只获取一个资源,如需多个则需建立多个连接)。

HTTP请求与响应格式详解

HTTP格式

每个HTTP请求和响应均遵循相同格式,包含Header和Body两部分,其中Body为可选部分。 HTTP协议属于文本协议,因此其格式非常直观简洁。

1 HTTP GET请求的格式:


GET /path HTTP/1.1
 Header1: Value1
 Header2: Value2
 Header3: Value3

每个Header独占一行,行尾换行符为\r\n。

2 HTTP POST请求的格式:


POST /path HTTP/1.1
 Header1: Value1
 Header2: Value2
 Header3: Value3

 body data goes here...

3 HTTP响应的格式:


200 OK
 Header1: Value1
 Header2: Value2
 Header3: Value3

 body data goes here...

若HTTP响应包含Body,同样通过\r\n\r\n进行分隔。 请注意,Body的数据类型由Content-Type头决定:若是网页,Body即为文本;若是图片,Body则为图片的二进制数据。 当存在Content-Encoding时,Body数据经过压缩,最常见的是gzip压缩。因此,遇到Content-Encoding: gzip时,需先对Body数据进行解压缩,才能获取真实数据。压缩旨在减小Body体积,加速网络传输。

Python实现静态Web服务器代码示例

demo:静态web服务器


import socket
import re
import time


def service_client(new_socket):
 """为这个客户端服务"""

 # 1.接收浏览器发送过来的请求,即http请求
 # GET / HTTP/1.1
 # --------
 request = new_socket.recv(1024).decode('utf-8')

 # 判断客户端意外断开链接返回空字符串
 if not request:
  # 关闭套接字并退出
  new_socket.close()
  print("==="*30)
  return

 # 分隔套接字
 request_lines = request.splitlines()
 print()
 print(">"*20)
 print(request_lines)

 file_name = ""
 ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
 if ret:
  file_name = ret.group(1)
  if file_name == "/":
   file_name = "/index.html"

 # 2.返回http格式数据 给浏览器
 try:
  f = open("./html" + file_name, "rb")
 except:
  response = "HTTP/1.1 404 NOT FOUND\r\n"
  response += "Content-Type:text/html;charset=utf-8\r\n"
  response += "\r\n"
  response += "<h1>404 not found <br> 没有发现所请求资源</h1>"
  response += str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
  new_socket.send(response.encode('utf-8'))
 else:
  html_content = f.read()
  f.close()
  # 2.1准备发送给浏览器的数据---header
  response = "HTTP/1.1 200 OK\r\n"
  response += "\r\n"
  # 2.2准备发送给浏览器的数据 ---body
  # 将response header发送给浏览器
  new_socket.send(response.encode("utf-8"))
  # 将response body发送给浏览器
  new_socket.send(html_content)

 # 关闭套接字
 new_socket.close()


def main():
 """用来完成整体的控制"""
 # 1.创建套接字
 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 # 端口复用
 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 # 2.绑定
 tcp_server_socket.bind(("", 7890))
 # 3.变为套接字
 tcp_server_socket.listen(128)

 while True:
  # 4.等待客户端的链接
  new_socket, client_addr = tcp_server_socket.accept()

  print(client_addr)

  # 5.为这个客户端服务
  service_client(new_socket)

 # 关闭监听套接字
 tcp_server_socket.close()


if __name__ == '__main__':
 main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。