Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python 3.6套接字pickle数据被截断_Python_Sockets_Pickle - Fatal编程技术网

python 3.6套接字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

我无法在套接字中发送我的numpy数组,我使用pickle,但我的客户端pickle崩溃,出现以下错误:pickle数据被截断

我的服务器: 我创建了numpy数组,我想用pickle发送我的客户机(这是我的工作)

我的客户 他有我的numpy数组,但我不能加载pickle,我有这个错误

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()