Python之HTTP静态服务器-面向对象版开发

Posted 老王同鞋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之HTTP静态服务器-面向对象版开发相关的知识,希望对你有一定的参考价值。

利用面向对象的思想完成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

60             response_header = Server: PWS/1.0

61             response_body = sorry nor found page!
.capitalize()
62             send_data = (response_line + response_header + 
 + response_body).encode(utf-8)
63             client_socket.send(send_data)
64         else:
65             # 如果存在则换回请求的页面信息
66             response_line = HTTP/1.1 200 OK

67             response_header = Server: PWS/1.0

68             send_data = (response_line + response_header + 
).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()

 

以上是关于Python之HTTP静态服务器-面向对象版开发的主要内容,如果未能解决你的问题,请参考以下文章

最新Python大数据之Python基础学生管理系统面向对象版

最新Python大数据之Python基础学生管理系统面向对象版

Python静态Web服务器-面向对象开发

Python之面向对象版学员管理系统

Python面向对象之封装

Python面向对象之结构与成员