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 将异常抛出即可完成非阻塞线程接收