import re
import select
import socket
class WSGIServer():
def __init__(self, port, document_root):
self.socket_listen = socket.socket()
self.socket_listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket_listen.bind(("", port))
self.document_root = document_root
self.socket_listen.listen(128)
self.client_socket_list = [self.socket_listen,]
self.socket_listen.setblocking(False)
def run_server(self):
while True:
r, w, e = select.select(self.client_socket_list, [], [], 5)
for obj in r:
if obj == self.socket_listen:
client_socket, addr = obj.accept()
client_socket.setblocking(False)
# print(client_socket)
self.client_socket_list.append(client_socket)
# print(self.client_socket_list)
else:
try:
request = obj.recv(1024).decode("utf-8")
except Exception:
pass
else:
if request:
self.handle_req(request, obj)
else:
obj.close()
self.client_socket_list.remove(obj)
def handle_req(self, request, obj):
print(request)
request_data_list = request.splitlines()
file_name = re.match(r"[^/]*([^ ]+)", request_data_list[0]).group(1)
if file_name == "/":
file_name = "/index.html"
try:
with open(self.document_root+file_name, "rb") as f:
html_content = f.read()
except Exception as e:
body = "====sorry ,file not found===="
header = "HTTP/1.1 404 not found\r\n"
header += "Content-Type: text/html; charset=utf-8\r\n"
header += "Content-Length: %d\r\n" % (len(body))
header += "\r\n"
else:
body = html_content
header = "HTTP/1.1 200 OK\r\n"
header += "Content-Type: text/html; charset=utf-8\r\n"
header += "Content-Length: %d\r\n" % (len(body))
header += "\r\n"
finally:
obj.send(header.encode("utf-8") + body)
DOCUMENT_TOOT = "./html" #静态文件
def main():
http_server = WSGIServer(8889,DOCUMENT_TOOT)
http_server.run_server()
if __name__ == '__main__':
main()
python select非阻塞 静态服务器
最新推荐文章于 2020-12-07 12:44:41 发布