与之前的socket方式不同,select通过轮流询问的方式监听(读取)客户端
select也存在阻塞,会等待到三个描述符至少一个准备就绪.
select函数参数为三个列表 分别为 r_list,w_list,e_list分别代表输入,输出,异常列表
返回参数也是这三个列表
实现方式如下
import select
import socket
s=socket.socket()
host=socket.gethostname()
port=1234
s.bind((host,port))
s.listen(5)
inputs=[s,]
outputs=[]
while True:
r_list,w_list,e_list=select.select(inputs,outputs,inputs,1)
for i in r_list:
if i is s:
c,addr=s.accept()
inputs.append(c)
print(str(addr)+"has been connected")
else:
try:
date=i.recv(1024)
print(str(i.getpeername))
print(date.decode())
outputs.appned(i)
except Exception as ex:
#inputs.remove(i)
pass
for t in w_list:
outputs.remove(t)
for g in e_list:
inputs.remove(g)
对上述程序进行解释:
前几排就是进行一些常规的网络配置
死循环中select带入列表并设置超时为1s
先遍历r_list如果是自身套接字则创建新的连接,并将新的连接
如果是inputs列表中的其他套接字则表示有数据传输过来,获取数据并打印
e_list中的都是有异常的套接字,视为断开连接,删除掉
值得注意的是:当客户端停止发送,程序会进行异常捕捉并视为断开连接,这里我pass掉以多次接受数据