IO多路复用socketServer
利用IO多路复用写一个socketServer,大多数情况下机几乎很难用到,因为有许许多多模块和框架已经为我们封装好了,简单了解一下底层的实践即可.
代码实现如下:
import select
import socket
import queue
#创建socket连接
server = socket.socket()
server.bind(('localhost',9000))
server.listen(1000)
#设置非阻塞模式
server.setblocking(False)
#key 为接受消息对象实例,key 为接受的数据
mes_dic = {}
#需要检测的连接列表
inputs = [server,]
#返回上一次的数据列表
outputs = []
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)#因为新建立的连接还没发数据过来,现在就接受的话程序就报错
#所以要想实现这个客户端发数据时server端能知道,就需要让select再监测
#初始化一个队列,后面存要返回给这个客户端的数据
mes_dic[conn] = queue.Queue()
else:
data = r.recv(1024)
mes_dic[r].put(data)
#放入返回的连接队列里
outputs.append(r)
#要返回给客户端的连接列表
for w in writeable:
data_to_client = mes_dic[w].get()
#返回给客户端源数据
w.send(data_to_client)
#确保下次循环的时候writeable,不反回这个已经处理完的连接
outputs.remove(w)
#异常
for e in exceptional:
if e in outputs:
outputs.remove(e)
inputs.remove(e)
del mes_dic[e]
I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。