码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-12-08 23:47:22      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:客户   静态服务器   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()

 

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

标签:客户   静态服务器   path   response   file   set   一个   页面   web服务   

原文地址:https://www.cnblogs.com/chao666/p/12008319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!