python 3.6套接字pickle数据被截断
我无法在套接字中发送我的numpy数组,我使用pickle,但我的客户端pickle崩溃,出现以下错误:pickle数据被截断 我的服务器: 我创建了numpy数组,我想用pickle发送我的客户机(这是我的工作) 我的客户 他有我的numpy数组,但我不能加载pickle,我有这个错误python 3.6套接字pickle数据被截断,python,sockets,pickle,Python,Sockets,Pickle,我无法在套接字中发送我的numpy数组,我使用pickle,但我的客户端pickle崩溃,出现以下错误:pickle数据被截断 我的服务器: 我创建了numpy数组,我想用pickle发送我的客户机(这是我的工作) 我的客户 他有我的numpy数组,但我不能加载pickle,我有这个错误 import socket, pickle import numpy as np HOST = 'localhost' PORT = 50007 s = socket.socket(socket.AF_INE
import socket, pickle
import numpy as np
HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
msg_a_envoyer = "hello".encode()
s.send(msg_a_envoyer)
while 1:
data = s.recv(4096)
if not data: break
data_arr = pickle.loads(data)
print (data_arr)
s.close()
问题是,如果pickle数据的大小大于4096,则只会得到pickle数据的第一部分(因此,
pickle数据被截断了您得到的消息)
只有在接收完成时,才能附加数据并对其进行pickle,例如:
data = b""
while True:
packet = s.recv(4096)
if not packet: break
data += packet
data_arr = pickle.loads(data)
print (data_arr)
s.close()
增加一个bytes对象不是很有效,但是最好将部分存储在对象列表中,然后加入。更快的变体:
data = []
while True:
packet = s.recv(4096)
if not packet: break
data.append(packet)
data_arr = pickle.loads(b"".join(data))
print (data_arr)
s.close()
用最简单的话来说。您尝试加载的文件不完整。要么您没有正确地下载它,要么就是您的pickle文件已损坏。您可以创建一个新的pickle来解决此问题,但您只保留4096位?
data = []
while True:
packet = s.recv(4096)
if not packet: break
data.append(packet)
data_arr = pickle.loads(b"".join(data))
print (data_arr)
s.close()