Python多任务版静态Web服务器实现示例

 更新时间:2022年06月17日 15:49:27   作者:落雨  
这篇文章主要为大家介绍了Python静态Web服务器多任务版实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

概述

使用多线程,让web服务器可以同时处理多个用户的访问。当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞。把创建的子线程设置成为守护主线程,防止主线程无法退出。

实现步骤

1.导入threading模块

import threading

2.设置端口号复用, 程序退出端口立即释放

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

3.当客户端和服务器建立连接程,创建子线程

设置target的名称,并且通过元组的方式传入new_socket参数

 sub_thread = threading.Thread(target=handle_client_request, args=(new_socket,))

4.设置守护主进程

sub_thread.setDaemon(True)

5.启动子线程

sub_thread.start()

代码实现

import socket
import threading
# 处理客户端的请求
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()
# 程序入口函数
def main():
    # 创建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)
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        print(ip_port)
        # 当客户端和服务器建立连接程,创建子线程
        sub_thread = threading.Thread(target=handle_client_request, args=(new_socket,))
        # 设置守护主线程
        sub_thread.setDaemon(True)
        # 启动子线程执行对应的任务
        sub_thread.start()
if __name__ == '__main__':
    main()

以上就是Python静态Web服务器多任务版实现示例的详细内容,更多关于Python静态Web服务器多任务的资料请关注脚本之家其它相关文章!

相关文章

  • Python sqlalchemy时间戳及密码管理实现代码详解

    Python sqlalchemy时间戳及密码管理实现代码详解

    这篇文章主要介绍了Python sqlalchemy时间戳及密码管理实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • python并发编程之线程实例解析

    python并发编程之线程实例解析

    这篇文章主要介绍了python并发编程之线程实例解析,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • python同步windows和linux文件

    python同步windows和linux文件

    这篇文章主要为大家详细介绍了python同步windows和linux文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Python基础入门之魔法方法与异常处理

    Python基础入门之魔法方法与异常处理

    在python中,所有以“__"双下划线包起来的方法,都统称为魔法方法,下面这篇文章主要给大家介绍了关于Python基础入门之魔法方法与异常处理的相关资料,需要的朋友可以参考下
    2021-11-11
  • 19个Python Sklearn中超实用的隐藏功能分享

    19个Python Sklearn中超实用的隐藏功能分享

    今天跟大家介绍 19 个 Sklearn 中超级实用的隐藏的功能,这些功能虽然不常见,但非常实用,它们可以直接优雅地替代手动执行的常见操作
    2022-07-07
  • 关于Flask 上下文详细介绍

    关于Flask 上下文详细介绍

    这篇文章主要给大家分享了关于Flask 上下文详细介绍,我们可以把上下文理解为当前环境的快照,是一个用来保存状态的对象。在代码执行的某个时刻,根据上下文的代码逻辑,可以决定在当前时刻下使用到的环境变量等。下面一起进入文章了解详情内容,需要的朋友也可以参考一下
    2021-11-11
  • Python中docx2txt库的使用说明

    Python中docx2txt库的使用说明

    这篇文章主要介绍了Python中docx2txt库的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 关于Python连接Cassandra容器进行查询的问题

    关于Python连接Cassandra容器进行查询的问题

    这篇文章主要介绍了Python连接Cassandra容器进行查询的问题,问题的关键在于寻找到Cassandra的9042端口,从而获取数据,具有内容详情跟随小编一起看看吧
    2021-11-11
  • 利用Python编写的实用运维脚本分享

    利用Python编写的实用运维脚本分享

    Python在很大程度上可以对shell脚本进行替代。笔者一般单行命令用shell,复杂点的多行操作就直接用Python了。本文归纳了Python中一些实用脚本操作,需要的可以参考一下
    2022-05-05
  • Python 实现opencv所使用的图片格式与 base64 转换

    Python 实现opencv所使用的图片格式与 base64 转换

    今天小编就为大家分享一篇Python 实现opencv所使用的图片格式与 base64 转换,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01

最新评论