2017-11-28 1 views
-1

Ich versuche, ein Array über TCP von einem Server-ähnlichen Skript zu einem Client-ähnlichen Skript zu senden. Das Array ist variabel, daher werden die Daten mithilfe von Paketen gesendet und dann beim Client zusammengefügt.Python3 TypeError: Sequenzelement 0: erwartet ein Byte-ähnliches Objekt, int gefunden

Die Daten, die ich zu senden versuche, stammen aus dem handschriftlichen Zahlencode MNIST für Deep Learning. Die serverseitigen Code ist:

tcp = '127.0.0.1' 
port = 1234 
buffer_size = 4096 
(X_train, y_train), (X_test, y_test) = mnist.load_data() 
test_data = (X_test, y_test) 

# Client-side Deep Learning stuff 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((tcp, port)) 
x = pickle.dumps(test_data) 
s.sendall(x) 
s.close() 

Die clientseitige Skript ein neuronales Netz lädt, die die Testdaten verwendet Klassen vorherzusagen. Das Skript für das Hören auf die Daten ist:

tcp = '127.0.0.1' 
port = 1234 
buffer_size = 4096 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((tcp, port)) 
print ('Listening...') 
s.listen(1) 

conn, addr = s.accept() 
data_arr = [] 

while True: 
    data_pack = conn.recv(buffer_size) 
    if not data: break 
    data_pack += data 

my_pickle = b"".join(data_pack) 
test_data = pickle.loads(my_pickle) 
print ("Received: " + test_data) 
conn.close() 

# Irrelevant Deep Learning stuff... 

Der Server die Daten ohne Probleme sendet, aber die Client-Abstürze beim Versuch, die Pakete, die durch den Client (my_pickle = ...) mit dem folgenden Fehler erhalten beitreten :

Wie sollte ich den Join formatieren, um die gesendeten Daten neu zu erstellen und für den Rest des Skripts zu verwenden?

+0

Etwas scheint in Ihrem Server Beispiel-Code zu fehlen: Sie 'verwenden data', noch' data' nie wird zugewiesen. – Evert

+0

Verwenden Sie einfach 'test_data = pickle.loads (data_pack)' und entfernen Sie die 'join'-Zeile:' data_pack' ist bereits ein bytes-Objekt, keine Liste. Sie können an eine Byte-Zeichenkette mit '+ =' anhängen, wie Sie es hier tun. – Evert

Antwort

0

Ich endete mit Pickle und ZeroMQ, um das Kommunikationsprotokoll zu behandeln. Ein Vorteil dieser Methode ist, dass ich mehr als ein Datenpaket senden kann.

Auf der Clientseite:

ip = '127.0.0.1' 
port = '1234' 

# ZeroMQ context 
context = zmq.Context() 

# Setting up protocol (client) 
sock = context.socket(zmq.REQ) 
sock.bind('tcp://'+ip+':'+port) 
print('Waiting for connection at tcp://'+ip+':'+port+'...') 
sock.send(pickle.dumps(X_send)) 
X_answer = sock.recv() 
sock.send(pickle.dumps(y_send)) 
print('Data sent. Waiting for classification...') 
y_answer = sock.recv() 
print('Done.') 

Und auf der Serverseite:

# ZeroMQ Context 
context = zmq.Context() 

# Setting up protocol (server) 
sock = context.socket(zmq.REP) 

ip = '127.0.0.1' 
port = '1234' 

sock.connect('tcp://'+ip+':'+port) 
print('Listening to tcp://'+ip+':'+port+'...') 

X_message = sock.recv() 
X_test = pickle.loads(X_message) 
sock.send(pickle.dumps(X_message)) 
y_message = sock.recv() 
y_test = pickle.loads(y_message) 
print('Data received. Starting classification...') 

# Classification process 

sock.send(pickle.dumps(y_message)) 
print('Done.') 
Verwandte Themen