# python非阻塞socket
2 min read
Table of Contents
来自socket的unblock(非阻塞)
前言
由于普通的server-socket一次只能处理一个client-socket.##
因为socket在accept等待接收和recv等待数据数据时都会阻塞, 每次处理client只能应对一个socket.
unblock code
server:
# serverimport socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.setblocking(False) # 将socket设置为非阻塞. 在创建socket对象后就进行该操作.
server.bind((socket.gethostbyname(socket.gethostname()), 4444))server.listen(5)
client_list = []
while True: try: connection, addr = server.accept() client_list.append((connection, addr)) print("connected:{}".format(addr))
# accept原本是阻塞的, 等待connect, 设置setblocking(False)后, accept不再阻塞, # 它会(不断的轮询)要求必须有connect来连接, 不然就引发BlockingIOError, 所以为了在没有connect时, # 我们捕捉这个异常并pass掉. except BlockingIOError: pass
for client_socket, client_addr in client_list: try: client_recv = client_socket.recv(1024) if client_recv: print("receive:{}>>>{}".format(client_addr, client_recv.decode('utf-8'))) client_socket.send(client_recv)
else: client_socket.close() print("downline:{}".format(client_addr)) client_list.remove((client_socket, client_addr))
except (BlockingIOError, ConnectionResetError): passclient:
# clientimport socketimport time
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect((socket.gethostbyname(socket.gethostname()), 4444))
while True: cRequest = input("send: ") client.send(cRequest.encode()) if cRequest == "quit": print("[+] Down line......") time.sleep(2) client.close() break