Python网络编程——静态Web服务器多任务版

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

概述

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



实现步骤

1.导入threading模块

importthreading


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()



代码实现

importsocketimportthreading# 处理客户端的请求defhandle_client_request(new_socket):
# 代码执行到此,说明连接建立成功recv_client_data=new_socket.recv(4096)
iflen(recv_client_data) ==0:
print("关闭浏览器了")
new_socket.close()
return# 对二进制数据进行解码recv_client_content=recv_client_data.decode("utf-8")
print(recv_client_content)
# 根据指定字符串进行分割, 最大分割次数指定2request_list=recv_client_content.split(" ", maxsplit=2)
# 获取请求资源路径request_path=request_list[1]
print(request_path)
# 判断请求的是否是根目录,如果条件成立,指定首页数据返回ifrequest_path=="/":
request_path="/index.html"try:
# 动态打开指定文件withopen("static"+request_path, "rb") asfile:
# 读取文件数据file_data=file.read()
exceptExceptionase:
# 请求资源不存在,返回404数据# 响应行response_line="HTTP/1.1 404 Not Found\r\n"# 响应头response_header="Server: PWS1.0\r\n"withopen("static/error.html", "rb") asfile:
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()
# 程序入口函数defmain():
# 创建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)
whileTrue:
# 等待接受客户端的连接请求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()


目录
相关文章
|
12月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
2685 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
9月前
|
运维 监控 数据可视化
Python 网络请求架构——统一 SOCKS5 接入与配置管理
通过统一接入端点与标准化认证,集中管理配置、连接策略及监控,实现跨技术栈的一致性网络出口,提升系统稳定性、可维护性与可观测性。
|
9月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
10月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
11月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
697 18
|
11月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
1799 1
|
11月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
579 0
|
12月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
3008 0
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解

推荐镜像

更多