1 import select
 2 import socket
 3 import queue
 4 
 5 server = socket.socket()#创建服务器端
 6 server.bind(('localhost',9999))#绑定IP和端口
 7 server.listen(1000)#参数为最大监听端口数量
 8 server.setblocking(False)#设置为非阻塞IO通信模式
 9 
10 inputs = [server,]#创建列表,元素0是本地server服务端
11 outputs = []#作为select第二个参数。
12 mid = {}#创建一个字典
13 while True:#无限死循环
14     """ readable对应第一个参数,其余分别对应。第三个参数是异常断开的连接,
15     第二个参数存储要往客户端发送的消息。第一个参数存放server新连接和所有连接
16     的二次通信连接。"""
17     readable,writeable,exceptional = select.select(inputs,outputs,inputs)
18     for r  in readable:#对客户端连接到服务端的连接遍历。
19         if r is server:#如果该连接是新连接
20             conn, addr = server.accept()#则创建该客户端连接实例。
21             inputs.append(conn)#并将该客户端加入到inputs列表。
22             mid[conn] = queue.Queue()#将实例写入字典与创建的新队列作为键值对。
23         else:
24             data = r.recv(1024)#接收客户端数据
25             print(data)
26             outputs.append(r)#将已经接收到客户端信息的实例存入outputs列表。
27             mid[r].put(data)#将输入存入队列
28     for w in writeable:#对需要向客户端发送的信息的列表进行遍历
29         data_client = mid[w].get()#取出队列中数据
30         w.send(data_client)#给客户端发送数据
31         outputs.remove(w)#在缓存表中删除已经发送数据的元素。
32     for e in exceptional:#对异常信息进行遍历
33         if e in outputs:#如果这个异常信息在等待发送信息的列表outputs里:
34             outputs.remove(e)#则删除
35         inputs.remove(e)#将其在inputs列表中删除。
36         del mid[e]#将其在字典中的键值对和队列删除。

 

posted on 2017-11-30 18:26  专注于区块链开发  阅读(456)  评论(0编辑  收藏  举报