gpt4 book ai didi

python - socket 。如何使用 socket.recv() 接收所有数据?

转载 作者:太空宇宙 更新时间:2023-11-03 15:58:56 24 4
gpt4 key购买 nike

我在从服务器到客户端接收数据时遇到问题。我有以下尝试从服务器接收数据的客户端函数。服务器使用socket.sendall(data)函数发送的数据大于buff_size所以我需要一个循环来读取所有数据。

def receiveAll (sock):
data = ""
buff_size = 4096
while True:
part = sock.recv (buff_size)
data + = part
if part <buff_size:
break;
return data

我遇到的问题是,在第一次迭代(读取第一个 4096mb)之后,程序在第二次被阻塞,等待 part = sock.recv (buff_size) 中的其他数据.我该怎么做才能让 recv() 可以继续读取其他丢失的数据?谢谢。

最佳答案

你的解释是错误的。您的代码读取它从服务器获得的所有数据。它只是不知道它应该停止监听传入的数据。它不知道服务器发送了它拥有的所有内容。

首先注意这几行

if part <buff_size:
break;

大错特错。首先,您将字符串与 int 进行比较(在 Python3.x 中会抛出异常)。但即使你的意思是if len(part) <buff_size:那么这仍然是错误的。因为首先在流式传输过程中可能存在延迟,您只会阅读比 buff_size 更小的部分。 .您的代码将停在那里。

此外,如果您的服务器发送的内容大小是 buff_size 的倍数然后是 if部分永远不会被满足,它会卡在 .recv() 上永远。

旁注:不要使用分号 ; .这是 Python。


您的问题有多种解决方案,但如果不修改服务器端,没有可以正确使用它们。

作为客户,您必须知道何时停止阅读。但是唯一知道它的方法是服务器是否做了一些特别的事情并且你会理解它。这称为通信协议(protocol)。您必须为发送/接收的数据添加含义。

例如,如果您使用 HTTP,则服务器会发送此 header Content-Length: 12345在 body 之前,现在作为客户,您知道您只需要阅读 12345字节(您的缓冲区不必那么大,但有了这些信息,您就会知道在全部读取之前必须循环多少次)。

例如,某些二进制协议(protocol)可能会发送前 2 或 4 个字节的内容大小。这在客户端也很容易解释。

更简单的解决方案是:让服务器在发送完所有数据后关闭连接。然后你只需要添加支票 if not part: break在您的代码中。

关于python - socket 。如何使用 socket.recv() 接收所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41596554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com