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]#将其在字典中的键值对和队列删除。