在 Python 中,可以使用 socket
库实现一个简单的 HTTP 服务器和客户端,手动处理 HTTP 请求和响应。下面是一个 Python 版本的 HTTP 服务器和客户端示例。
一、使用 socket
实现 HTTP 服务器
HTTP 服务器的基本原理是监听指定端口,等待客户端请求,解析 HTTP 请求,并返回 HTTP 响应。
简单的 HTTP 服务器
import socket
def run_http_server(host='127.0.0.1', port=8080):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(5) # 监听最多 5 个连接
print(f"HTTP 服务器运行在 http://{host}:{port}")
while True:
client_socket, client_address = server_socket.accept()
print(f"收到来自 {client_address} 的连接请求")
request_data = client_socket.recv(1024).decode()
print(f"收到请求数据:\n{request_data}")
# 构造简单的 HTTP 响应
response = """HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head><title>Python HTTP Server</title></head>
<body><h1>你好,欢迎访问 Python HTTP 服务器!</h1></body>
</html>"""
client_socket.send(response.encode())
client_socket.close()
if __name__ == "__main__":
run_http_server()
运行后,你可以在浏览器访问 http://127.0.0.1:8080
,就能看到返回的 HTML 页面!
二、使用 socket
实现 HTTP 客户端
一个 HTTP 客户端的基本原理是向服务器发送 HTTP 请求,并解析服务器返回的响应数据。
简单的 HTTP 客户端
import socket
def http_get_request(host='127.0.0.1', port=8080, path='/'):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port))
# 构造 HTTP GET 请求
request = f"GET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n"
client_socket.send(request.encode())
# 接收服务器的响应
response = client_socket.recv(4096).decode()
print(f"收到服务器响应:\n{response}")
client_socket.close()
if __name__ == "__main__":
http_get_request()
运行后,你可以看到服务器返回的 HTML 页面源码!
三、使用 http.server
模块快速启动 HTTP 服务器
Python 提供了一个标准库 http.server
,可以快速启动一个 HTTP 服务器:
import http.server
import socketserver
PORT = 8080
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print(f"HTTP 服务器运行在 http://127.0.0.1:{PORT}")
httpd.serve_forever()
运行后,http://127.0.0.1:8080
会自动加载当前目录的文件作为网页。
总结
socket
库可以用来手动实现 HTTP 服务器和客户端。http.server
可以快速搭建一个 HTTP 服务器,适用于静态文件共享。- 生产环境建议使用
Flask
或Django
这样的框架,而不是手写 HTTP 服务器。
你可以试试上面的代码,感受 HTTP 协议的基础实现!🚀