我无法在套接字中发送我的numpy数组,我使用pickle但是我的客户端pickle崩溃了这个错误:pickle数据被截断
我的服务器: 我创建numpy数组,我想发送我的客户端pickle(它的工作)
import socket, pickle
import numpy as np
from PIL import ImageGrab
import cv2
while(True):
HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 4096)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print ('Connected by', addr)
arr = np.array([[0, 1], [2, 3]])
printscreen_pil=ImageGrab.grab(bbox=(10,10,500,500))
img = np.array(printscreen_pil) ## Transform to Array
data_string = pickle.dumps(img)
conn.send(data_string)
msg_recu = conn.recv(4096)
print(msg_recu.decode())
conn.close()
我的客户 他有我的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()
答案 0 :(得分:6)
问题是,如果腌制数据的大小是> 4096你只得到腌制数据的第一部分(因此你得到的pickle data was truncated
消息)
您必须附加数据并仅在接收完成时将其腌制,例如:
data = b""
while True:
packet = s.recv(4096)
if not packet: break
data += packet
data_arr = pickle.loads(data)
print (data_arr)
s.close()
增加一个字节对象的性能不是很好,最好将这些部分存储在一个对象列表中,然后join
。更快的变体:
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()
答案 1 :(得分:-1)
用最简单的话来说。您尝试加载的文件不完整。要么您没有正确下载它,要么只是您的泡菜文件已损坏。你可以新建一个pickle来解决这个问题