【发布时间】: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