#coding:utf-8
importsocketimportreimportsysfrom multiprocessing importProcessclassHTTPServer(object):def __init__(self, application):"""application:指的是框架的app"""self.server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
self.app=applicationdefstart(self):
self.server_socket.listen(128)whileTrue:
client_socket, client_address=self.server_socket.accept()print("[%s, %s]用户连接上了" %client_address)
handle_client_process= Process(target=self.handle_client, args=(client_socket,))
handle_client_process.start()
client_socket.close()defstart_response(self, status, headers):
response_headers= "HTTP/1.1" + status + "\r\n"
for header inheaders:
response_headers+= "%s: %s\r\n" %header
self.response_headers=response_headersdefhandle_client(self, client_socket):"""处理客户端请求"""
#获取客户端请求数据
request_data = client_socket.recv(1024)print("request data:", request_data)
request_lines=request_data.splitlines()for line inrequest_lines:print(line)#解析请求报文
request_start_line =request_lines[0]#提取用户请求的文件名及请求方法
file_name = re.match(r"\w+ +(/[^ ]*)", request_start_line.decode("utf-8")).group(1)
method= re.match(r"(\w+) +/[^ ]*", request_start_line.decode("utf-8")).group(1)
env={"PATH_INFO": file_name,"METHOD": method
}
response_body=self.app(env, self.start_response)
response= self.response_headers + "\r\n" +response_body#向客户端返回响应数据
client_socket.send(bytes(response, "utf-8"))#关闭客户端连接
client_socket.close()defbind(self, port):
self.server_socket.bind(("", port))defmain():if len(sys.argv) < 2:
sys.exit("python MyWebServer.py Module:app")
module_name, app_name= sys.argv[1].split(":")#module_name = "MyWebFrameWork"
#app_name = "app"
m = __import__(module_name)
app=getattr(m, app_name)
http_server=HTTPServer(app)
http_server.bind(8000)
http_server.start()if __name__ == "__main__":
main()