page contents

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

面向对象方式的多任务web服务器程序

1. 以面向对象的方式开发静态Web服务器

实现步骤:

  1. 把提供服务的Web服务器抽象成一个类(HTTPWebServer)

  2. 提供Web服务器的初始化方法,在初始化方法里面创建socket对象

  3. 提供一个开启Web服务器的方法,让Web服务器处理客户端请求操作。

2. 静态Web服务器-面向对象开发的示例代码

import socket
import threading


# 定义web服务器类
class HttpWebServer(object):
  def __init__(self):
      # 创建tcp服务端套接字
      tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      # 设置端口号复用, 程序退出端口立即释放
      tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
      # 绑定端口号
      tcp_server_socket.bind(("", 9000))
      # 设置监听
      tcp_server_socket.listen(128)
      # 保存创建成功的服务器套接字
      self.tcp_server_socket = tcp_server_socket

  # 处理客户端的请求
  @staticmethod
  def handle_client_request(new_socket):
      # 代码执行到此,说明连接建立成功
      recv_client_data = new_socket.recv(4096)
      if len(recv_client_data) == 0:
          print("关闭浏览器了")
          new_socket.close()
          return

      # 对二进制数据进行解码
      recv_client_content = recv_client_data.decode("utf-8")
      print(recv_client_content)
      # 根据指定字符串进行分割, 最大分割次数指定2
      request_list = recv_client_content.split(" ", maxsplit=2)

      # 获取请求资源路径
      request_path = request_list[1]
      print(request_path)

      # 判断请求的是否是根目录,如果条件成立,指定首页数据返回
      if request_path == "/":
          request_path = "/index.html"

      try:
          # 动态打开指定文件
          with open("static" + request_path, "rb") as file:
              # 读取文件数据
              file_data = file.read()
      except Exception as e:
          # 请求资源不存在,返回404数据
          # 响应行
          response_line = "HTTP/1.1 404 Not Found\r\n"
          # 响应头
          response_header = "Server: PWS1.0\r\n"
          with open("static/error.html", "rb") as file:
              file_data = file.read()
          # 响应体
          response_body = file_data

          # 拼接响应报文
          response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
          # 发送数据
          new_socket.send(response_data)
      else:
          # 响应行
          response_line = "HTTP/1.1 200 OK\r\n"
          # 响应头
          response_header = "Server: PWS1.0\r\n"

          # 响应体
          response_body = file_data

          # 拼接响应报文
          response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
          # 发送数据
          new_socket.send(response_data)
      finally:
          # 关闭服务与客户端的套接字
          new_socket.close()

  # 启动web服务器进行工作
  def start(self):
      while True:
          # 等待接受客户端的连接请求
          new_socket, ip_port = self.tcp_server_socket.accept()
          # 当客户端和服务器建立连接程,创建子线程
          sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,))
          # 设置守护主线程
          sub_thread.setDaemon(True)
          # 启动子线程执行对应的任务
          sub_thread.start()


# 程序入口函数
def main():
  # 创建web服务器对象
  web_server = HttpWebServer()
  # 启动web服务器进行工作
  web_server.start()


if __name__ == '__main__':
  main()

3. 小结

  1. 把提供服务的Web服务器抽象成一个类(HTTPWebServer)

     class HttpWebServer(object):
  2. 提供Web服务器的初始化方法,在初始化方法里面创建socket对象

    def __init__(self):
    # 初始化服务端套接字,设置监听,代码省略..
  3. 提供一个开启Web服务器的方法,让Web服务器处理客户端请求操作。

    def start(self):
    while True:
        service_client_socket, ip_port = self.tcp_server_socket.accept()
        # 连接建立成功,开辟子线程处理客户端的请求
        sub_thread = threading.Thread(target=self.handle_client_request, args=(service_client_socket,))
        sub_thread.start()
    相关文章:

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

    Tornado框架安装和简单使用

    django项目部署上线完整教程(Centons7)

    更多技术干货,请关注六星教育社区-程序员编程技术分享分享交流学习高端论坛
  • 发表于 2021-03-18 17:21
  • 阅读 ( 554 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章