import os
from socket import AF_INET, SOCK_STREAM, socket
from typing import List, Generator
import magic
server_name = 'Computer_Network'
server_port = 12000
def get_response(req: str) -> Generator[bytes, None, None]:
if len(req) == 0:
return None
file_addr: str = req.splitlines()[0].split(' ')[1].replace('/', 'static\\')
file_content: bytes = bytes()
not_found: bool = False
print("请求的地址:", file_addr)
if file_addr == 'static\\':
file_addr = 'static\\index.html'
if not os.path.exists(file_addr):
not_found = True
else:
with open(file_addr, 'rb') as f:
file_content = f.read()
http_ver: str = req.splitlines()[0].split(' ')[2].lstrip()
status_code: str = "404 Not Found" if not_found else "200 OK"
data_length = len(file_content)
mime_type: str = ''
if os.path.exists(file_addr):
mime_type = str(magic.from_file(file_addr, mime=True))
response_head: str = \
"%s %s\r\n" \
"Connection:keep-alive\r\n" \
"Content-Length:%d\r\n" \
"Content-Type:%s\r\n" \
"\r\n" % (http_ver, status_code, data_length, mime_type)
print("响应头:", response_head)
all_data: bytes = response_head.encode("utf-8") + file_content
i: int = 0
MCU = 1024
while (i < len(file_content)):
data: bytes = all_data[i:(i+MCU)]
i += MCU
yield data
if __name__ == '__main__':
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.bind(('', server_port))
server_socket.listen(1)
print("服务器已经开始运行")
while True:
connected_socket, addr = server_socket.accept()
req = connected_socket.recv(1024).decode()
print('请求头:', req)
print('\n')
print("本次发送数据的大小:", end=" ")
for data in get_response(req):
print(len(data), end=' ')
connected_socket.send(data)
print('\n')
connected_socket.close()