微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 套接字,不接收所有内容

如何解决Python 套接字,不接收所有内容

我试图让电脑的树将它发送到主机并将其保存到一个文件中,但是,我一直收到树的一小部分,同时它确实打印出“用户”端的所有内容

服务器:

conn.send(command.encode(self.FORMAT))
print("[COMMAND SENT] Waiting for execution")
                
msg_length = conn.recv(self.HEADER).decode(self.FORMAT)
final_rcv = conn.recv(int(msg_length)).decode(self.FORMAT)
                
with open(str(adres[0]) + "_" + str(adres[1]) + ".txt","w",encoding="utf-8") as f:
    f.write(final_rcv)
f.close()

客户:

string_ = ''

for line in tree(Path.home() / ''):
  string_ += line
  string_ += "\n"
                
msg_length = str(len(string_.encode(self.FORMAT)))
self.s.send(msg_length.encode(self.FORMAT))
self.s.send(string_.encode(self.FORMAT))
print(string_)
print(msg_length)

感谢您的时间,我希望您可以使用这是未来。 编辑:运行代码时没有错误

解决方法

运行代码时没有错误。

虽然可能没有错误,但您调用的函数有返回值。但是你忽略了这些。具体来说,send 将返回实际发送的字节数,这不一定与要求发送的数据大小相同。来自the documentation

... 返回发送的字节数。 应用程序负责检查所有数据是否已发送;如果仅传输了部分数据,则应用程序需要尝试传输剩余数据。 ...

正如明确记录的那样,rhe 程序需要检查 send 的返回值以确定是否还有未写入的数据,然后再send 这些数据(并且只有这些)。你的程序没有。或者,您可以只使用 sendall:

... 与 send() 不同,此方法继续从字节发送数据,直到所有数据都已发送或发生错误...

请注意,您在调用 recv 时也有同样的错误假设。与您的预期相反,此函数不能保证读取完整数据,但可能只读取一部分。您必须检查实际读取了多少,并在必要时再次(可能再次)调用 recv 以读取其余数据。来自the documentation

... 返回值是一个字节对象,表示接收到的数据。一次接收的最大数据量由 bufsize 指定。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。