标签:客户 静态服务器 path response file set 一个 页面 web服务
利用面向对象的思想完成HTTP静态Web服务器的开发。
主要思路如下:
1.抽象出一个服务器类
1.1 编写类的对象属性
1.2 编写类的方法
注意:
在进行请求资源路径判断时,需要确认请求路径中是否包含参数,如果包含参数,需要通过split方法对请求的资源路径进行分割,并取出分割后的数据。
1 # 1.导入socket模块 2 import socket 3 # import gevent 4 import threading 5 6 7 # 创建服务器类 8 class HttpServerSocket(object): 9 # 给服务器类的对象设置属性 10 def __init__(self): 11 # 2.创建Socket对象 12 self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 # 3.设置端口复用 14 self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 15 # 4.绑定端口 16 self.server_socket.bind((‘‘, 9000)) 17 # 5.设置监听 18 self.server_socket.listen(128) 19 20 def start(self): 21 while True: 22 # 6.等待客户端连接 23 client_socket, ip_port = self.server_socket.accept() 24 # gevent.spawn(self.task, client_socket, ip_port) 25 print("上线了", ip_port) 26 threading.Thread(target=self.task, args=(client_socket, ip_port), daemon=True).start() 27 28 def task(self, client_socket, ip_port): 29 # 7.接收数据 30 recv_data = client_socket.recv(1024).decode(‘utf-8‘) 31 print(recv_data) 32 if not recv_data: 33 print("客户端:%s下线了,端口号为:%s" % ip_port) 34 35 # 8.发送数据 36 # 判断请求资源是否包含参数 37 # 请求行格式:GET /index.html HTTP/1.1 38 recv_path = recv_data.split()[1] 39 # print("第一次分割",recv_path) 40 # 如果有参数则以?分割 41 if ‘?‘ in recv_path: 42 real_recv_path = recv_path.split(‘?‘)[0] 43 # print("?分割",real_recv_path) 44 else: 45 # 如果没有参数,则保持请求路径不变 46 real_recv_path = recv_path 47 # print("无?分割",real_recv_path) 48 49 # 设置没指定资源路径,默认返回index.html 50 if real_recv_path == ‘/‘: 51 real_recv_path = ‘/index.html‘ 52 53 # 判断请求的资源路径是否存在 54 try: 55 with open(f"static{real_recv_path}", "rb") as file: 56 response_body = file.read() 57 except: 58 # 如果不存在则返回404 59 response_line = ‘HTTP/1.1 404 NOT FOUND\r\n‘ 60 response_header = ‘Server: PWS/1.0\r\n‘ 61 response_body = ‘sorry nor found page!\r\n‘.capitalize() 62 send_data = (response_line + response_header + ‘\r\n‘ + response_body).encode(‘utf-8‘) 63 client_socket.send(send_data) 64 else: 65 # 如果存在则换回请求的页面信息 66 response_line = ‘HTTP/1.1 200 OK\r\n‘ 67 response_header = ‘Server: PWS/1.0\r\n‘ 68 send_data = (response_line + response_header + ‘\r\n‘).encode(‘utf-8‘) + response_body 69 client_socket.send(send_data) 70 finally: 71 # 断开与客户端连接 72 client_socket.close() 73 74 def __del__(self): 75 # 当服务端程序结束时停止服务器服务 76 self.server_socket.close() 77 78 79 def main(): 80 http_socket = HttpServerSocket() 81 http_socket.start() 82 83 84 if __name__ == ‘__main__‘: 85 main()
标签:客户 静态服务器 path response file set 一个 页面 web服务
原文地址:https://www.cnblogs.com/chao666/p/12008319.html