静态Web服务器-以⾯向对象的模式开发
步骤
1. 把提供服务的Web服务器抽象成⼀个类(HTTPWebServer)
2. 提供Web服务器的初始化⽅法,在初始化⽅法⾥⾯创建socket对象
3. 提供⼀个启动Web服务器的⽅法,让Web服务器处理客户端请求操 作。
示例
1 import socket 2 import threading 3 4 # 获取用户请求资源的路径 5 # 根据请求资源的路径,读取指定文件的数据 6 # 组装指定文件数据的响应报文,发送给浏览器 7 # 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器 8 class HttpWebServer: 9 def __init__(self): 10 # 1.编写一个TCP服务端程序 11 # 创建socekt 12 self.tcp_server_socekt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 # 设置端口复用 14 self.tcp_server_socekt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 15 # 绑定地址 16 self.tcp_server_socekt.bind(("", 8080)) 17 # 设置监听 18 self.tcp_server_socekt.listen(128) 19 20 def handle_client_request(self, client_socekt): 21 # 获取浏览器的请求信息 22 client_request_data = client_socekt.recv(1024).decode() 23 print(client_request_data) 24 # 获取用户请求资源的路径 25 requst_data = client_request_data.split(" ") 26 print(requst_data) 27 28 # 判断客户端是否关闭 29 if len(requst_data) == 1: 30 client_socekt.close() 31 return 32 # 求资源的路径 33 request_path = requst_data[1] 34 35 if request_path == "/": 36 request_path = "/index.html" 37 38 # 3.读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器 39 # 根据请求资源的路径,读取指定文件的数据 40 try: 41 with open("./static" + request_path, "rb") as f: 42 file_data = f.read() 43 except Exception as e: 44 # 返回404错误数据 45 # 应答行 46 response_line = "HTTP/1.1 404 Not Found\r\n" 47 # 应答头 48 response_header = "Server:pwb\r\n" 49 # 应答体 50 response_body = "404 Not Found sorry" 51 # 应答数据 52 # 组装指定文件数据的响应报文,发送给浏览器 53 response_data = (response_line + response_header + "\r\n" + response_body).encode() 54 55 client_socekt.send(response_data) 56 else: 57 # 应答行 58 response_line = "HTTP/1.1 200 OK\r\n" 59 # 应答头 60 response_header = "Server:pwb\r\n" 61 # 应答体 62 response_body = file_data 63 # 应答数据 64 # 组装指定文件数据的响应报文,发送给浏览器 65 response_data = (response_line + response_header + "\r\n").encode() + response_body 66 67 client_socekt.send(response_data) 68 finally: 69 # 4.HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字 70 client_socekt.close() 71 72 def start(self): 73 while True: 74 # 2.获取浏览器发送的HTTP请求报文数据 75 # 建立链接 76 client_socekt, client_addr = self.tcp_server_socekt.accept() 77 # 创建子线程 78 sub_thread = threading.Thread(target=self.handle_client_request, args=(client_socekt,)) 79 sub_thread.start() 80 81 82 if __name__ == '__main__': 83 # 创建服务器对象 84 my_web_server = HttpWebServer() 85 # 启动服务器 86 my_web_server.start()
总结
1. 把提供服务的Web服务器抽象成⼀个类(HTTPWebServer)
1. 把提供服务的Web服务器抽象成⼀个类(HTTPWebServer)
2. 提供Web服务器的初始化⽅法,在初始化⽅法⾥⾯创建socket对象
def __init__(self): # 1.编写一个TCP服务端程序 # 创建socekt self.tcp_server_socekt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口复用 self.tcp_server_socekt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 绑定地址 self.tcp_server_socekt.bind(("", 8080)) # 设置监听 self.tcp_server_socekt.listen(128)
3. 提供⼀个启动Web服务器的⽅法,让Web服务器处理客户端请求操 作。
def start(self): while True: # 2.获取浏览器发送的HTTP请求报文数据 # 建立链接 client_socekt, client_addr = self.tcp_server_socekt.accept() # 创建子线程 sub_thread = threading.Thread(target=self.handle_client_request, args=(client_socekt,)) sub_thread.start()