【问题标题】:Pickle data was truncated — only a problem when sending from macosPickle 数据被截断——只有从 macos 发送时出现问题
【发布时间】:2021-07-15 23:34:38
【问题描述】:

我正在尝试将数据从运行 Big Sur 11.2.3 的本地计算机发送到远程服务器。

server.py

import socket, pickle
import env

print("Server is listening on port %s..." % env.PORT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((env.HOST, env.PORT))
s.listen(1)
conn, addr = s.accept()
print("Connected to %s" % str(addr))

data = []
while True:
    packet = conn.recv(1024)
    if not packet: break
    data.append(packet)
data = pickle.loads(b"".join(data))
print(data)
conn.close()

client.py

import socket, pickle
import env

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((env.HOST, env.PORT))

variable = ['a', 'b', 'c', 'd'] * (2**14)

data_string = pickle.dumps(variable)
s.send(data_string)

s.close()
print('Data sent to server')

这最初在使用variable = ['a', 'b', 'c', 'd'] 时有效,为了模拟发送更大的对象,我只是将它乘以大数。我最初认为如果数据大于我指定服务器作为每个数据包接收的字节数就会失败,但是这段代码一直有效,直到我乘以2**14(使用2**13 有效)。

奇怪的是,如果我从我的 Raspberry Pi 尝试这个(即将数据从 pi 发送到远程服务器),它工作正常。但是当我在我的 macbook 上做同样的事情时,我得到了

Traceback (most recent call last):
  File "server.py", line 17, in <module>
    data = pickle.loads(b"".join(data))
_pickle.UnpicklingError: pickle data was truncated

这可能是什么原因导致无法在 macOS 上运行? 如果我在本地尝试(即在我的 macbook 上运行服务器和客户端实例),它工作正常,但是当我尝试从 mac 发送到另一台机器时失败(当我尝试从 mac 发送到pi)。

我了解到,当发送和接收腌制数据的机器运行不同版本的 python 时,可能会出现问题,但我认为这不是问题所在。远程服务器运行 python 3.6.9,我的 pi 运行 python 3.7.3。为了确保这一点,我在运行 3.6.9 的虚拟环境中运行我的 macbook 上的脚本,但它仍然失败。

【问题讨论】:

    标签: python-3.x macos sockets pickle


    【解决方案1】:
    s.send(data_string)
    

    您很幸运,它在 MacOS 上失败。 send 不保证发送所有数据,但您应该检查实际发送了多少数据并再次(可能再次)调用send 以发送其余数据。或使用sendall

    来自the documentation

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

    为什么send 在不同的平台或环境中表现不同?因为send 只是将数据放入套接字发送缓冲区。缓冲区的大小有限,可以特定于操作系统、操作系统配置、应用程序、系统的当前状态(即内存压力与否)...。单个send 只会将与当前可用空间一样多的数据放入发送缓冲区。如果缓冲区已满,它将阻塞,直到一些空间空闲。但它不能确保所有东西都可以放入套接字缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多