io多路复用(三)
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import socket 4 sk1 = socket.socket() 5 sk1.bind(('127.0.0.1',8001,)) 6 sk1.listen() 7 8 inputs = [sk1,] 9 outputs = [] 10 message_dict = {} 11 import select 12 while True: 13 # [sk1,sk2,sk3]select内部自动监听sk1,sk2,sk3,三个对象,一旦某个句柄发生变化(accept()) 14 # 如果有链接sk1 15 # r_list = [sk1,sk2] 16 r_list,w_list,e_list = select.select(inputs,outputs,inputs,1) 17 print('正在监听的socket对象%d' % len(inputs)) 18 print(r_list) 19 for sk1_or_conn in r_list: 20 # 每一个链接对象 21 if sk1_or_conn ==sk1: 22 # 表示有新用户链接 23 conn,adress = sk1_or_conn.accept() 24 inputs.append(conn) 25 message_dict[conn] = [] 26 else: 27 # 表示有老用户来链接 28 try: 29 data_bytes = sk1_or_conn.recv(1024) 30 except Exception as e: 31 else: 32 data_str = str(data_bytes, encoding='utf-8') 33 message_dict[sk1_or_conn].append(data_str) 34 outputs.append(sk1_or_conn) 35 #sk1_or_conn.sendall(bytes(data_str + '好', encoding='utf-8')) 36 for conn in w_list: 37 recv_str = message_dict[conn][0] 38 del message_dict[conn][0] 39 conn.sendall(bytes(recv_str + '好', encoding='utf-8')) 40 outputs.remove(conn) 41 for sk in e_list: 42 inputs.remove(sk)