import socket
from multiprocessing import Process
import re
HOME_DIR = './html'
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 允许端口被重复绑定,放在bind前
server_socket.bind(('', 8000))
server_socket.listen(128)
def handle_client(client_process):
client_request_data = client_process.recv(1024)
print(client_request_data)
client_request_data_list = client_request_data.splitlines()
request_start_line = client_request_data_list[0].decode('utf-8')
file_name = re.match(r"\w+\s*(/[^ ]*)\s*", request_start_line).group(1)
file_name = '/index.html' if '/' == file_name else ''
response_start_line = "HTTP/1.1 200 OK\r\n"
response_header = 'Sever: My server\r\n'
try:
file_handle = open(HOME_DIR + file_name, 'rb')
response_body = file_handle.read().decode('utf-8') # 需先转为字符串满足下方的字符串拼接
file_handle.close()
except IOError:
response_start_line = "HTTP/1.1 404 Not Found\r\n"
response_header = 'Sever: My server\r\n'
response_body = 'The file not found'
response_data = response_start_line + response_header + "\r\n" + response_body
print("response_data:", response_data)
client_process.send(bytes(response_data, 'utf-8')) # python3 要求只能发送二进制数据
# client_process.send(response_data.encode('utf-8'))
client_process.close()
while True:
client_socket, client_addr = server_socket.accept()
client_socket_process = Process(target=handle_client, args=(client_socket,))
client_socket_process.start()
client_socket.close() # client_socket已在子进程中拷贝了一份,所以主进程中的可以关闭
client_socket_process.join() # 等待子进程结束
使用的为python3 ,socket 发送文件(send)方法必须发送二进制数据