如果没有可用数据,请从套接字停止recv

时间:2015-05-21 11:31:53

标签: python sockets socketserver

我试图阻止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()方面取得了一些成功,但我宁愿不使用它,因为它总是会浪费时间在程序中,它更像是一种解决方法。

1 个答案:

答案 0 :(得分:1)

收到所有数据后,您必须停止while循环。因此,在每次recv之后,您必须检查接收的数据长度是否是您请求的文件长度。如果是,则打破循环并对该数据执行某些操作。

recv不知道是否完成了数据发送,因为它不知道数据有多长。它只是在你或其他终端关闭连接之前永远倾听。

您还可以使用非阻塞套接字(顺便说一下,这样做更好)。

相关问题