Web静态服务器-8-gevent版
from gevent import monkey
import gevent
import socket
import sys
import re
monkey.patch_all()
class WSGIServer(object):
"""定义一个WSGI服务器的类"""
def __init__(self, port, documents_root):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(("", port))
self.server_socket.listen(128)
self.documents_root = documents_root
def run_forever(self):
"""运行服务器"""
while True:
new_socket, new_addr = self.server_socket.accept()
gevent.spawn(self.deal_with_request, new_socket)
def deal_with_request(self, new_socket):
"""为这个浏览器服务器"""
request = new_socket.recv(1024).decode('utf-8')
if not request:
return
request_lines = request.splitlines()
for i, line in enumerate(request_lines):
print(i, line)
ret = re.match(r"([^/]*)([^ ]+)", request_lines[0])
if ret:
print("正则提取数据:", ret.group(1))
print("正则提取数据:", ret.group(2))
file_name = ret.group(2)
if file_name == "/":
file_name = "/index.html"
try:
f = open(self.documents_root+file_name, "rb")
except:
response_header = "HTTP/1.1 404 not found\r\n"
response_header += "Content-Type: text/html; charset=utf-8\r\n"
response_header += "\r\n"
response_body = "file not found, 请输入正确的url"
new_socket.send(response_header.encode('utf-8'))
new_socket.send(response_body.encode("utf-8"))
else:
content = f.read()
response_header = "HTTP/1.1 200 OK\r\n"
response_header += "\r\n"
response_body = content
new_socket.send(response_header.encode('utf-8'))
new_socket.send(response_body)
f.close()
finally:
new_socket.close()
def main():
"""控制web服务器整体"""
if len(sys.argv) == 2:
port = sys.argv[1]
if port.isdigit():
port = int(port)
else:
print("运行方式如: python3 xxx.py 7890")
return
print("http服务器使用的port:%s" % port)
http_server = WSGIServer(port, "./html")
http_server.run_forever()
if __name__ == "__main__":
main()