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)

 

posted @ 2017-02-28 21:53  Erick-LONG  阅读(210)  评论(0编辑  收藏  举报