2017-06-19 5 views
0

ich nicht meine numpy Array in Buchse senden kann, verwende ich Beize aber il meines Klienten Beize Absturz mit diesem Fehler: Beize Daten waren abgeschnittenerPython 3.6 Buchse Beize Daten abgeschnitten wurden

mein Server: i numpy Array zu erstellen und ich möchte in meinem Klienten mit Gurke (es Arbeit)

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

mein Mandant Er habe meine numpy Array schicken, aber ich kann mit Gurke nicht geladen werden, ich diesen Fehler haben.

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

Aber Sie erhalten nur 4096 Bits? –

Antwort

2

das Problem ist, dass, wenn die Größe der eingelegten Daten> 4096 Sie nur den ersten Teil der eingelegten Daten erhalten (daher die pickle data was truncated Nachricht Sie bekommen)

Sie haben die anhängen Daten und Gurke es nur dann, wenn der Empfang abgeschlossen ist, zum Beispiel wie folgt aus:

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

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

ein Byte Objekt zu erhöhen, ist nicht sehr performant, wäre besser, die Teile in einer Liste von Objekten zu speichern, dann join, though. Schnellere Variante:

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

danke, es ist Arbeit! – sazearte