122-python-非阻塞IO模型
# server:
import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.setblocking(False) # 把 socket 中所有需要阻塞的方法都改变成非阻塞 sk.listen() conn_l = [] # 用来存储所有来请求 server端的 conn连接 del_conn = [] # 用来储存所有已经断开与 server端连接的 conn while True: try: conn,addr = sk.accept() # 不阻塞,但是没有人连接会报错 print('建立连接了',addr) conn_l.append(conn) except BlockingIOError: for con in conn_l: try: msg = con.recv(1024) #非阻塞,如果没有数据会报错 if msg == b'': del_conn.append(con) continue print(msg) con.send(b'bye') except:pass for con in del_conn: conn_l.remove(con) del_conn.clear()
# client:
import time import socket import threading def fn(): sk = socket.socket() sk.connect(('127.0.0.1',8080)) sk.send(b'hello') time.sleep(1) print(sk.recv(1024)) sk.close() for i in range(20): threading.Thread(target=fn,).start()