**动态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)    收藏  举报

导航