**静态文件的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) 收藏 举报
浙公网安备 33010602011771号