1 import selectors,socket
2
3 sel = selectors.DefaultSelector()
4
5 def accept(sock,mask):
6 conn,addr = sock.accept()
7 print('accepted:',conn,'from',addr)
8 conn.setblocking(0)
9 sel.register(conn,selectors.EVENT_READ,read)
10
11 def read(conn,mask):
12 data = conn.recv(1024)
13 if data:
14 print(data.decode('utf8'))
15 conn.send(data)
16 else:
17 print('closing',conn)
18 sel.unregister(conn)
19 conn.close()
20
21 sock = socket.socket()
22 sock.bind(('127.0.0.1',8000))
23 sock.listen(100)
24 sock.setblocking(0)
25 sel.register(sock,selectors.EVENT_READ,accept)
26
27 while True:
28 events = sel.select() #默认阻塞,已有数据就返回连接列表
29 for key,mask in events:
30 callback = key.data #accept
31 callback(key.fileobj,mask) #key.fileobj = socket