**动态web服务器(简单版)


1 '''动态web服务器''' 2 import socket 3 import re 4 import sys 5 from multiprocessing import Process 6 7 #根目录文件 8 HTML_ROOT_DIR='./html' 9 WSGI_ROOT_DIR='./wsgi' 10 11 class HttpServer(): 12 def __init__(self): 13 # tcp服务器 14 self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 15 self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 让端口号可以复用 16 17 def bind(self,port): 18 self.server_socket.bind(('', port)) 19 20 def start(self): 21 self.server_socket.listen() 22 23 while True: 24 client_socket, client_addr = self.server_socket.accept() 25 # print('{}--{}'.format(client_addr[0],client_addr[1])) 26 27 client_process = Process(target=self.handle_client, args=(client_socket,)) 28 client_process.start() 29 client_socket.close() 30 31 def start_response(self,status,headers): 32 ''' status='200 OK' 33 headers=[('Content-Type','text/plain')]''' 34 response_headers = 'HTTP/1.1 '+status+'\r\n' 35 for header in headers: 36 response_headers+="{}:{}\r\n".format(header[0],header[1]) 37 self.response_headers=response_headers 38 39 def handle_client(self,client_socket): 40 '''处理客户端请求''' 41 #获取请求数据 42 request_data= client_socket.recv(1024) 43 # print('request_data:{}'.format(request_data)) 44 45 #解析请求报文 46 request_lines = request_data.decode('utf-8').splitlines() 47 request_start_line=request_lines[0] 48 49 #提取用户请求的文件名-GET /index.html HTTP/1.1-即提取出“index.html” 50 print(request_start_line) 51 file_dir=re.match(r"\w+ +(/[^ ]*) ",request_start_line).group(1) 52 53 if file_dir.endswith('.py'): 54 m=__import__(file_dir[1:-3]) 55 env={} 56 response_body=m.application(env,self.start_response) 57 response=self.response_headers+'\r\n'+response_body 58 print(response) 59 60 else: 61 #判断如果url是: http://127.0.0.1:7000,就改成 http://127.0.0.1:7000/index.html 62 if file_dir=='/': 63 file_dir='/index.html' 64 65 file_name=HTML_ROOT_DIR+file_dir 66 print(file_name) 67 68 #打开文件读取内容 69 try: 70 file=open(file_name, 'rb') 71 except IOError: 72 response_start_line = 'HTTP/1.1 404 NotFund\r\n' 73 response_header = "Server: cherryning\r\n" 74 response_body = 'this file is not exit' 75 else: 76 response_start_line = 'HTTP/1.1 200 OK\r\n' 77 response_header = "Server: cherryning\r\n" 78 response_body = (file.read()).decode('utf-8') 79 file.close() 80 81 #构造响应数据 82 response=response_start_line+response_header+'\r\n'+response_body 83 print(response_body) 84 85 # 向客户端发送响应数据 86 client_socket.send(response.encode('utf-8')) 87 88 def main(): 89 sys.path.insert(1,WSGI_ROOT_DIR) 90 http_server=HttpServer() 91 http_server.bind(7000) 92 http_server.start() 93 94 if __name__ == '__main__': 95 main()
执行结果:


posted on 2019-09-07 13:13 cherry_ning 阅读(174) 评论(0) 收藏 举报
浙公网安备 33010602011771号