python socket 非阻塞 linux 环境

python socket 非阻塞 revc 接收数据

环境为 windows

使用 setblocking(False) 函数将服务器接收模式设置为非阻塞模式,异常处理 BlockingIOError 错误即可,因为 accept 没有在非阻塞模式下没有接收到客户端连接的话会触发 ***BlockingIOError ***这个错误,异常处理抛出即可。


import socket
import time
import threading

ip_port = ('127.0.0.1',5555)   #  ip  port
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.setblocking(False)
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind(ip_port)
sk.settimeout()
sk.listen(5)

def print_data(sk,addr):
    print(addr)
    time_cache = int(time.time())
    str_cache = ""
    while True:
        try:
            print(time.time())
            if int(time.time()) - time_cache >= 10:   #因为非阻塞,循环进行时间间隔判断,客户端建立连接且10s 内没有发送数据,服务器主动断开连接结束线程
                print(str_cache)
                sk.close()
                break
            mes = sk.recv(1024)
            if mes:   # 多条数据进行拼接
                time_cache = int(time.time())
                str_cache = str_cache + mes.hex()
        except Exception:   # 异常处理  抛出
            pass

if __name__ == '__main__':
    while True:
        try:
            conn, addr = sk.accept()
            thread = threading.Thread(target=print_data, args=(conn, addr), name=addr)
            thread.start()
        except BlockingIOError:
            pass
    sk.close()

环境为 linux

linux 环境下 setblocking(False) 函数无效,但是可以通过对 recv 函数添加 0x40 参数达到非阻塞的效果,
将上述代码中的 替换为这个即可

mes = sk.recv(1024,0x40)

注意 这里 recv 需要用 try 做处理, 没有接收数据的话会触发异常,使用 try 将异常抛出即可完成非阻塞线程接收

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值