单进(线)程非堵塞实现原理

原理:

 1 import socket
 2 import time
 3 
 4 
 5 def main():
 6     # 创建套接字
 7     tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 8     # 绑定端口
 9     tcp_server_socket.bind(("",7890))
10     # 设置监听状态
11     tcp_server_socket.listen(128)
12     # 设置非堵塞
13     tcp_server_socket.setblocking(False)
14 
15     new_client_list = list()
16 
17     while True:
18         time.sleep(0.5)
19         try:
20             new_client, client_addr = tcp_server_socket.accept()
21         except Exception as ret:
22             print("-----没有新的客户端进来-----")
23         else:
24             print("----没有产生异常,意味一个新客户端到来-----")
25             # 为新客户端非堵塞服务
26             new_client.setblocking(False)
27             # 把新产生的socket存入列表
28             new_client_list.append(new_client)
29 
30         for new_client_socket in new_client_list:
31             try:
32                 recv_data = new_client_socket.recv(1024)
33             except Exception as ret:
34                 print("----客户端没有发来数据-----")
35             else:
36                 print("-----没有异常,意味着有数据-----")
37                 # 如果发来的数据不为空
38                 if recv_data:
39                     print("----客户端发来的数据-----")
40                 # 如果数据为空,意味着客户端调用了close()
41                 else:
42                     new_client_socket.close()
43                     new_client_list.remove(new_client_socket)
44                     print("----客户端已关闭-----")
45 
46     # 关闭套接字
47     tcp_server_socket.close()
原文地址:https://www.cnblogs.com/yifengs/p/11418724.html