2016-08-03 9 views
0

Ich versuche, ein Wörterbuch zu meinem Client zu senden, und es ist fin auf dem Server-Ende, aber wenn es das Wörterbuch unpickling bekommt, kommt es mit Fehler KeyError: 'Y'.Pickle Key Fehler "Y" mit Socket

Warum?

Hier ist mein Code:

client.py:

import socket, pickle 

s = socket.socket() 
s.connect(("localhost", 10000)) 

def userDump(): 
    s.sendall("userdump") 
    d = s.recv(1024) 
    return pickle.loads(d) 

print userDump() 

s.close() 

server.py:

import pickle, socket 
s = socket.socket() 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
address = 'localhost' 
port = 10000 
s.bind((address, port)) 
s.listen(5) 

while True: 
    c, clientaddress = s.accept() 
    c.send("You're Connected") 
    d = c.recv(1024) 
    if d == "userdump": 
     u = {"hello":"hi", "hi":"hello"} 
     print u 
     c.send(pickle.dumps(u)) 

    c.close() 

Antwort

0

Ihre Funktion userDump() soll korrigiert werden:

def userDump(): 

    d = s.recv(1024) 
    s.sendall("userdump") 
    d = s.recv(1024)  
    return pickle.loads(d) 

In Ihrem Code erhalten Sie "You're Connected" in d und Sie versuchen, es zu entpacken.

1

Es hilft sicher nicht, dass die Nachricht "Sie sind verbunden" wird mit dem Gurken in Ihrem Client verkettet. Wenn Sie das send aus dem Servercode entfernen, scheint Ihr Programm ordnungsgemäß zu funktionieren.

+0

Wenn die Antwort nicht offensichtlich ist, wird das "Y" am Anfang der Nachricht von der Funktion "pickle.loads" in einem Dictionary von Pickle-Feldtypen nachgeschlagen, und es gibt kein "type" Y '" Feld. – holdenweb

-1

Das Beizprotokoll ist versionsabhängig. Könnte es sein, dass Sie verschiedene Python/Pickle-Versionen auf Client und Server verwenden? Wählen Sie in diesem Fall explizit eine niedrige Protokollversion, wie in der docs erläutert.

Alternativ JSON oder etwas namens verwenden Pyro

(O, und zwar zunächst die Korrektur durch holdenweb vorgeschlagen machen ...)

+0

Ok, wenn Sie möchten, aber wie kann ein Leser mit nur den Informationen, die Jonah zur Verfügung stellt, sicher sein, dass die gleiche Protokollversion auf Client und Server verwendet wird? Zusammengesetzte Fehler passieren ... –