非堵塞思想实现单进程单线程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()

猜你喜欢

转载自www.cnblogs.com/zuzhuangmengxiang/p/12688298.html
今日推荐