2017-06-19 100 views
0

我不能把我的numpy的阵列中的插座,我用泡菜,但IL我的客户咸菜坠毁与此错误:泡菜数据被截断蟒蛇3.6插座泡菜数据被截断

我的服务器: 我创建numpy的阵列和我想在我的客户端发送与泡菜(它的工作)

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的数组,但我不能加载咸菜,我有这个错误。

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

但是,你只能感觉到4096位? –

回答

2

的问题是,如果腌制数据的大小> 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() 
+0

谢谢,它的工作! – sazearte