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

stop recv from socket if no data is available

我正试图阻止 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

在服务器端,我发送了一张图片,然后服务器在 host.sendall(string) 之后等待。 所以我想在几次接收后(因为图片更大,客户端必须更频繁地接收)它会检测到 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() 方面取得了一些成功,但我宁愿不使用它,因为它总是会在程序中浪费时间,而且它更像是一种解决方法。

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

recv 不知道数据发送是否完成,因为它不知道数据有多长。它只是永远倾听,直到您或其他端点关闭连接。

你也可以使用非阻塞套接字(顺便说一句,这样更好)。