上篇博客使用了进程、线程、协程实现了多任务的HTTP服务器。本文使用非阻塞单线程进程实现多任务。
1.设置套接字为非阻塞状态
2.建立一个列表用来装交互的套接字
3.遍历列表,如果收到数据则进行交互,如果收到的数据为空,则说明浏览器关闭,关闭套接字,从列表中删除这个套接字
import socketimport timetcp_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("---客户端已经关闭----")