Python网络编程之带select的异步IO

与之前的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掉以多次接受数据


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值