我试图阻止recv无休止地等待输入。
首先我尝试了:
recv = bytes('','UTF-8')
while True:
data_recv = self.socketclient.recv(1024*768)
if not data_recv:
break
else:
recv += data_recv
return recv
在Serverside上我发送了一张图片然后服务器在host.sendall(字符串)之后等待。 所以我想在接收几次后(由于图片越大,客户端必须经常接收),它会检测到data_recv == false并停止但不会发生。
我的第二次尝试是使用select()
do_read = False
recv = bytes('','UTF-8')
while True:
read_sockets,write_sockets,error_sockets = select.select([self.socketclient],[],[])
do_read = bool(read_sockets)
print (do_read)
if do_read:
print ("read")
data_recv = self.socketclient.recv(640*480)
recv += data_recv
else:
break
return recv
有了这个,他只从print(do_read)读取True,然后也停止并无休止地等待。我也曾期望在某些时候阅读False。
所以我的问题是如何管理它,我的客户端从套接字读取整个字符串,如果没有任何内容发送它停止?
我在self.socketclient.settimeout()方面取得了一些成功,但我宁愿不使用它,因为它总是会浪费时间在程序中,它更像是一种解决方法。
答案 0 :(得分:1)
收到所有数据后,您必须停止while循环。因此,在每次recv之后,您必须检查接收的数据长度是否是您请求的文件长度。如果是,则打破循环并对该数据执行某些操作。
recv不知道是否完成了数据发送,因为它不知道数据有多长。它只是在你或其他终端关闭连接之前永远倾听。
您还可以使用非阻塞套接字(顺便说一下,这样做更好)。