非堵塞思想实现单进程单线程TCP服务器并发
将套接字设置成默认非堵塞状态,用捕获异常处理套接字因非堵塞出现的异常,达到程序的正常运行,效果如下:
1 import socket 2 3 4 def main(): 5 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 tcp_server_socket.bind(('', 7788)) 7 tcp_server_socket.listen(128) 8 tcp_server_socket.setblocking(False) # 设置监听套接字为非堵塞 9 10 client_socket_list = list() # 设置一个列表储存客户端套接字 11 while True: 12 try: 13 new_socket, client_addr = tcp_server_socket.accept() 14 except: 15 pass 16 # print("没有新的客户端连接") 17 else: 18 print("来了一个客户端") 19 new_socket.setblocking(False) # 设置客户端套接字为非堵塞 20 client_socket_list.append(new_socket) 21 22 # 列表为空是for循环不会执行 23 for client_socket in client_socket_list: 24 try: 25 recv_data = client_socket.recv(1024) 26 except: 27 pass 28 # print("没有接受到客户端的数据") 29 else: 30 if recv_data: 31 print(recv_data.decode('utf-8')) 32 # 当recv有接收但无数据时,证明客户端关闭了连接 33 else: 34 client_socket_list.remove(client_socket) 35 client_socket.close() 36 37 38 if __name__ == '__main__': 39 main()