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


目录
相关文章
|
2天前
|
机器学习/深度学习 自然语言处理 PyTorch
使用Python实现循环神经网络(RNN)的博客教程
使用Python实现循环神经网络(RNN)的博客教程
21 1
|
1天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
14 6
|
1天前
|
数据采集 机器学习/深度学习 前端开发
【好书推荐3】Python网络爬虫入门到实战
【好书推荐3】Python网络爬虫入门到实战
10 0
|
1天前
|
监控 Linux 测试技术
LabVIEW网络服务器何使用,有哪些不同
LabVIEW网络服务器何使用,有哪些不同
|
2天前
|
机器学习/深度学习 算法 TensorFlow
Python深度学习基于Tensorflow(6)神经网络基础
Python深度学习基于Tensorflow(6)神经网络基础
16 2
Python深度学习基于Tensorflow(6)神经网络基础
|
2天前
|
存储 Shell 网络安全
|
2天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
3天前
|
机器学习/深度学习 PyTorch 算法框架/工具
使用Python实现卷积神经网络(CNN)
使用Python实现卷积神经网络(CNN)的博客教程
24 1
|
5天前
|
存储 JavaScript 前端开发
Python网络数据抓取(5):Pandas
Python网络数据抓取(5):Pandas
28 8
|
11天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】循环神经网络(RNN)与LSTM详解
【4月更文挑战第30天】本文探讨了处理序列数据的关键模型——循环神经网络(RNN)及其优化版长短期记忆网络(LSTM)。RNN利用循环结构处理序列依赖,但遭遇梯度消失/爆炸问题。LSTM通过门控机制解决了这一问题,有效捕捉长距离依赖。在Python中,可使用深度学习框架如PyTorch实现LSTM。示例代码展示了如何定义和初始化一个简单的LSTM网络结构,强调了RNN和LSTM在序列任务中的应用价值。

热门文章

最新文章