zoukankan      html  css  js  c++  java
  • 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 Exception as e:
    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()
    该花的钱要花,该吃的饭要吃。
  • 相关阅读:
    等待事件统计信息--Wait Events Statistics
    实时监控SQL
    PHP中常用的魔术方法
    PHP生成缩略图(3)--封装类
    PHP生成缩略图(2)--等比缩略图
    PHP生成缩略图(1)--简单缩略图
    调用天气预报接口
    使用JSON实现分页
    使用AJAX实现分页
    AJAX缓存问题
  • 原文地址:https://www.cnblogs.com/chao666/p/12008319.html
Copyright © 2011-2022 走看看