import socket
import re
import threading
import sys
class Wsgi:
def __init__(self, ip_port):
# 创建套接字
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
self.socket.bind(("", ip_port))
self.socket.listen(128)
# 静态文件路径
self.static_files = "./static"
def request_deal(self, new_socket):
try:
recv_data = new_socket.recv(1024).decode("utf-8")
except:
new_socket.close()
else:
if not recv_data:
new_socket.close()
# 提取请求的文件(index.html)
# GET /a/b/c/d/e/index.html HTTP/1.1
request_url = re.search(r"/\S*", recv_data).group()
if request_url == "/":
request_url = "/index.html"
try:
file = open(self.static_files + request_url, "r")
except:
print("没有找到这个文件%s" % request_url)
response_headers_line = "HTTP/1.1 404 not found\r\n"
response_headers = "Content-Type:text/html;charset=utf-8\r\n"
new_socket.send((response_headers_line + response_headers + "\r\n" + "网页没有找到").encode("utf-8"))
else:
response_headers_line = "HTTP/1.1 200 ok\r\n"
response_headers = "Content-Type:text/html;charset=utf-8\r\n"
new_socket.send((response_headers_line + response_headers + "\r\n" + file.read()).encode("utf-8"))
finally:
new_socket.close()
def run(self):
while True:
# 服务器一直等待客户端连接
new_socket, ip_port = self.socket.accept()
# 多线程的方式同时运行多个客户端
reso_url_thread = threading.Thread(target=self.request_deal, args=(new_socket,))
reso_url_thread.start()
if __name__ == '__main__':
# 传参数执行sys.argv
# 正确的执行方式是 python tcp-server.py 8080
if len(sys.argv) == 2:
# 输入端口必须是数字
if not sys.argv[1].isdigit():
print("输入方式应该为:python tcp-server.py 端口")
# sys.argv[1] 代表的是端口8000,需要强转成int类型
else:
a = Wsgi(int(sys.argv[1]))
a.run()
else:
print("输入方式应该为:python tcp-server.py 端口")