如果没有数据可用,停止从套接字接收
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 不知道数据发送是否完成,因为它不知道数据有多长。它只是永远倾听,直到您或其他端点关闭连接。
你也可以使用非阻塞套接字(顺便说一句,这样更好)。
我正试图阻止 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 不知道数据发送是否完成,因为它不知道数据有多长。它只是永远倾听,直到您或其他端点关闭连接。
你也可以使用非阻塞套接字(顺便说一句,这样更好)。