python 3.6 socket pickle 数据被截断

标签 python sockets pickle

我无法在套接字中发送我的 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()

最佳答案

问题是,如果 pickle 数据的大小 > 4096,您只会得到 pickle 数据的第一部分(因此 pickle data was truncated 您得到的消息)

您必须附加数据并仅在接收完成时对其进行 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 对象的性能不是很好,但是最好将这些部分存储在一个对象列表中,然后 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()

关于python 3.6 socket pickle 数据被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44637809/

相关文章:

python - 是否必须将 redis-py 对象设置为全局变量才能在函数中使用?

python - 使用 Python 的 Windows 10 中的文件权限

python - Scipy LeastSq 误差线

python - 列表理解可以有前缀,后缀吗?

python - 无法使用 python 中的套接字模块远程登录到 Windows

sockets - 什么是.sock文件以及如何与它们通信

sockets - 在IP层面, "leave the connection open"是否具有特定的技术含义——例如存储IP映射条目的中间网关?

python - 保存到外部 PY 文件?

如果列表为空,Python 会阻塞线程

python - 单例 python 生成器?或者,pickle 一个 python 生成器?