1. 首先,需要导入socket模块来建立Socket连接,开启监听端口。
import socket
HOST, PORT = '', 8888 # 监听地址和端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建TCP Socket对象
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置socket选项,可复用地址
s.bind((HOST, PORT)) # 绑定地址和端口
s.listen(16) # 开始监听客户端连接
2. 接下来,需要实现解析HTTP请求的函数,包括读取请求报文、解析报文头部、查询请求文件是否存在等。
def handle_request(request):
request_lines = request.split('\r\n')
method, path, http_version = request_lines[0].split(' ')
file_path = path[1:]
if file_path == '':
file_path = 'index.html'
try:
with open(file_path, 'rb') as f:
response_body = f.read()
status_line = 'HTTP/1.1 200 OK\r\n'
except FileNotFoundError:
response_body = b'<h1>404 Not Found</h1>'
status_line = 'HTTP/1.1 404 Not Found\r\n'
headers = 'Content-Type: text/html; charset=utf-8\r\n'
response = status_line + headers + '\r\n' + response_body.decode('utf-8')
return response
3. 接着,需要实现处理客户端连接的函数,接收客户端请求,调用解析HTTP请求的函数生成响应报文并发送给客户端。
def handle_client(conn):
request = conn.recv(1024).decode('utf-8')
response = handle_request(request)
conn.sendall(response.encode('utf-8'))
conn.close()
4. 最后,需要使用无限循环等待客户端连接,接收客户端请求并交给处理客户端连接的函数来处理。
while True:
conn, addr = s.accept() # 接收客户端连接
print('Connected by', addr)
handle_client(conn) # 处理客户端连接
通过以上步骤,就实现了一个简单的静态Web服务器。