**静态文件的web服务器代码

 1 import socket
 2 import re
 3 from multiprocessing import Process
 4 
 5 #根目录文件
 6 HTML_ROOT_DIR='./html'
 7 
 8 def handle_client(client_socket):
 9     '''处理客户端请求'''
10     #获取请求数据
11     request_data= client_socket.recv(1024)
12     # print('request_data:{}'.format(request_data))
13 
14     #解析请求报文
15     request_lines = request_data.decode('utf-8').splitlines()
16     request_start_line=request_lines[0]
17 
18     #提取用户请求的文件名-GET /index.html HTTP/1.1-即提取出“index.html”
19     print(request_start_line)
20     file_dir=re.match(r"\w+ +(/[^ ]*) ",request_start_line).group(1)
21 
22     #判断如果url是: http://127.0.0.1:7000,就改成 http://127.0.0.1:7000/index.html
23     if file_dir=='/':
24         file_dir='/index.html'
25 
26     file_name=HTML_ROOT_DIR+file_dir
27     print(file_name)
28 
29     #打开文件读取内容
30     try:
31         file=open(file_name, 'rb')
32     except IOError:
33         response_start_line = 'HTTP/1.1 404 NotFund\r\n'
34         response_header = "Server: cherryning\r\n"
35         response_body = 'this file is not exit'
36     else:
37         response_start_line = 'HTTP/1.1 200 OK\r\n'
38         response_header = "Server: cherryning\r\n"
39         response_body = (file.read()).decode('utf-8')
40         file.close()
41 
42     #构造响应数据
43     response=response_start_line+response_header+'\r\n'+response_body
44     print(response_body)
45 
46     # 向客户端发送响应数据
47     client_socket.send(response.encode('utf-8'))
48 
49 if __name__ == '__main__':
50     # tcp服务器
51     server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
52     server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  #让端口号可以复用
53     server_socket.bind(('',7000))
54     server_socket.listen()
55 
56     while True:
57         client_socket,client_addr=server_socket.accept()
58         # print('{}--{}'.format(client_addr[0],client_addr[1]))
59 
60         client_process=Process(target=handle_client,args=(client_socket,))
61         client_process.start()
62         client_socket.close()

运行结果:

GET /index.html HTTP/1.1
./html/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Cherry ning</title>
</head>
<body>
    <h1>hi</h1>
    <p1>hello</p1>
</body>
</html>

 

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

 

 

posted on 2019-09-05 22:45  cherry_ning  阅读(116)  评论(0)    收藏  举报

导航