select 对程序进行同时检测,当发生响应时,数据被拷贝到内核区域,内核区通知用户程序来进行读取数据,内核区域并不知道是客户端连接,因此需要进行循环
server_socket 端
import select, socket, queue
server = socket.socket()
server.bind(('localhost', 6000))
server.listen(1000)
server.setblocking(False) #不会发生阻塞
inputs = [server, ] #创建一个检测列表
outputs = []
msg_dict = {}
while True:
readable, writeable, exceptional = select.select(inputs, outputs, inputs)
for r in readable:
if r is server:
conn, addr = server.accept()
inputs.append(conn) #如果是一个client连接,把其添加到检测列表中
msg_dict[conn] = queue.Queue() #初始化一个队列
else:
data = r.recv(1024)
msg_dict[r].put(data)
outputs.append(r) #添加到输出列表中
for w in writeable:
data = msg_dict[w].get()
w.send(data)
outputs.remove(w)
for e in exceptional:
if e in outputs:
outputs.remove(e)
inputs.remove(e)