静态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
1. 把提供服务的Web服务器抽象成⼀个类(HTTPWebServer)

2. 提供Web服务器的初始化⽅法,在初始化⽅法⾥⾯创建socket对象

1
2
3
4
5
6
7
8
9
10
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服务器处理客户端请求操 作。

1
2
3
4
5
6
7
8
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()

  

posted @   Allen_Hao  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示