2017-06-19 3 views
0

je ne peux pas envoyer mon tableau numpy dans la prise, j'utilise cornichon mais il mon accident de cornichon client avec cette erreur: les données de conserves au vinaigre était tronquéepython 3.6 données cornichon socket a été tronqué

mon serveur: i créer une matrice numpy et je veux envoyer mon client avec cornichon (c'est un travail)

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

mon client il a mon tableau numpy, mais je ne peux pas charger avec cornichon, j'ai cette erreur.

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

Mais vous ne recevez que 4096 bits? –

Répondre

2

le problème est que si la taille des données marinée est> 4096 vous obtenez seulement la première partie des données marinées (d'où le message pickle data was truncated que vous obtenez)

Vous devez ajouter le données et cornichon que lorsque la réception est terminée, par exemple comme ceci:

data = b"" 
while True: 
    packet = s.recv(4096) 
    if not packet: break 
    data += packet 

data_arr = pickle.loads(data) 
print (data_arr) 
s.close() 

de plus en plus un objet octets n'est pas très performant, serait préférable de stocker les pièces dans une liste d'objets, puis join, cependant. Variante plus rapide:

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

merci, c'est du boulot! – sazearte