2017-06-19 102 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