上一篇
Python实现静态Web服务器完整教程 - 从零搭建HTTP服务
- Python
- 2025-08-11
- 1487
Python实现静态Web服务器完整指南
本文将详细介绍:
- HTTP协议基本原理
- 使用socket处理网络请求
- 解析HTTP请求报文
- 返回静态文件响应
- 处理404错误
- 完整可运行代码示例
一、HTTP服务器核心原理
静态Web服务器需要实现:
- 监听TCP端口(通常80/8080)
- 接收客户端HTTP请求
- 解析请求路径对应的静态文件
- 构造HTTP响应头和文件内容
- 发送响应给客户端
二、完整代码实现
创建server.py文件:
import socket
import os
SERVER_HOST = '0.0.0.0'
SERVER_PORT = 8080
WEB_ROOT = 'static' # 静态文件目录
def handle_request(client_socket):
# 接收客户端请求数据
request = client_socket.recv(1024).decode()
# 解析请求路径
request_line = request.split('\n')[0]
filename = request_line.split()[1][1:] or 'index.html'
try:
# 读取请求文件内容
with open(os.path.join(WEB_ROOT, filename), 'rb') as f:
content = f.read()
# 构造成功响应
response = f"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n".encode()
response += content
except FileNotFoundError:
# 文件不存在返回404
response = "HTTP/1.1 404 Not Found\r\n\r\n404 File Not Found
".encode()
# 发送响应并关闭连接
client_socket.sendall(response)
client_socket.close()
def run_server():
# 创建TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(5)
print(f"服务器启动 http://{SERVER_HOST}:{SERVER_PORT}")
while True:
# 等待客户端连接
client_socket, addr = server_socket.accept()
print(f"接收到来自 {addr} 的连接")
handle_request(client_socket)
if __name__ == "__main__":
run_server()
三、使用说明
- 创建项目目录:
mkdir my_server && cd my_server mkdir static # 静态文件存放目录
- 在static目录放入测试文件(如index.html)
- 启动服务器:
python server.py
- 浏览器访问:http://localhost:8080
四、关键功能解析
1. HTTP请求解析
解析请求首行获取资源路径:
GET /index.html HTTP/1.1 → 提取路径: '/index.html'
2. 文件路径处理
防止路径遍历攻击:
# 安全处理示例
filename = filename.replace('../', '') # 过滤上级目录访问
3. 响应头构造
基础HTTP响应结构:
HTTP/1.1 200 OK Content-Type: text/html [空行] <html>...</html>
五、扩展功能建议
- 添加MIME类型支持(CSS/JS/图片等)
- 实现目录列表功能
- 添加访问日志记录
- 支持HTTP/1.1持久连接
- 增加简单的CGI支持
通过本教程,您已掌握Python实现静态Web服务器的核心方法。这个基础服务器每秒可处理数百个请求,是理解HTTP协议和网络编程的绝佳实践。
本文由YinTaoDai于2025-08-11发表在吾爱品聚,如有疑问,请联系我们。
本文链接:http://521pj.cn/20257854.html
发表评论