#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Vergil Fu
import select,socket,queue
server = socket.socket()
server.bind(('localhost',9000))
server.listen(1000)
server.setblocking(False) ###############################################设置非阻塞
msg_dic = {}
inputs = [server,]########################################################设置一个初始列表
outputs = []
while True:
readable ,writeable ,exceptional= select.select(inputs, outputs, inputs )
print(readable,writeable,exceptional)
for r in readable:
if r is server: ##################################################来了一个新客户连接
conn,addr = server.accept()
print("来了个新连接",addr)
inputs.append(conn) ##########################################因为只是连接了还没发送数据过来,所以加入列表让select监听
msg_dic[conn] = queue.Queue() ################################初始化一个队列,后面存要返回给这个客户端的数据
else:
data = r.recv(1024)
print("收到数据",data)
msg_dic[r].put(data)
outputs.append(r) ############################################放入返回的连接队列里
for w in writeable:##################################################要返回给客户端的连接列表
data_to_client = msg_dic[w].get()
w.send(data_to_client) ###########################################返回给客户端源数据
outputs.remove(w) ################################################确保下次循环的时候writeable,不返回这个已经处理完的连接了
for e in exceptional:
if e in outputs:
outputs.remove(e)
inputs.remove(e)
del msg_dic[e]