上篇博客使用了进程、线程、协程实现了多任务的HTTP服务器。本文使用非阻塞单线程进程实现多任务。
1.设置套接字为非阻塞状态
2.建立一个列表用来装交互的套接字
3.遍历列表,如果收到数据则进行交互,如果收到的数据为空,则说明浏览器关闭,关闭套接字,从列表中删除这个套接字
import socket
import time
tcp_server_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_tcp.bind(("", 7899))
tcp_server_tcp.listen(128)
tcp_server_tcp.setblocking(False) # 设置套接字为非堵塞的方式
client_socket_list = list()
while True:
# time.sleep(0.5)
try:
new_socket, new_addr = tcp_server_tcp.accept()
except Exception as ret:
print("---没有新的客户端到来---")
else:
print("---只要没有产生异常,那么也就意味着 来了一个新的客户端----")
new_socket.setblocking(False) # 设置套接字为非堵塞的方式
client_socket_list.append(new_socket)
for client_socket in client_socket_list:
try:
recv_data = client_socket.recv(1024)
except Exception as ret:
print(ret)
print("----这个客户端没有发送过来数据----")
else:
print("-----没有异常-----")
print(recv_data)
if recv_data:
# 对方发送过来数据
print("----客户端发送过来了数据-----")
else:
# 对方调用close 导致了 recv返回
client_socket.close()
client_socket_list.remove(client_socket)
print("---客户端已经关闭----")
上篇博客用进程、线程、协程实现多任务HTTP服务器,本文介绍使用非阻塞单线程进程实现多任务。具体步骤为设置套接字为非阻塞状态,建立列表装交互套接字,遍历列表,根据收到的数据情况进行交互或关闭套接字等操作。
3478

被折叠的 条评论
为什么被折叠?



