serialisation et réseau
Le
DarkPearl
Bonjour tout le monde,
J'ai un probleme avec la sérialisation en python.
J'ai fait une application serveur et une autre client qui communique
par socket tcp.
je veux que le client transmette au serveur un dictionnaire. Pour ce
faire j'utilise pickle pour serialiser le dictionnaire en chaine de
caractère : "string_a_envoyer = pickle.dumps(dico)"
Sur le serveur, je recois le message et je le deserialise : "dico =
pickle.loads(string_recu)"
Quand je test sur la boucle local, tout fonctionne bien, alors que
quand la communication se passe via internet, la deserialisation
echou.
Quelqu'un pourrait m'expliquer pourquoi ca ne fonctionne pas?
PS: je travail uniquement sur distribution linux.
J'ai un probleme avec la sérialisation en python.
J'ai fait une application serveur et une autre client qui communique
par socket tcp.
je veux que le client transmette au serveur un dictionnaire. Pour ce
faire j'utilise pickle pour serialiser le dictionnaire en chaine de
caractère : "string_a_envoyer = pickle.dumps(dico)"
Sur le serveur, je recois le message et je le deserialise : "dico =
pickle.loads(string_recu)"
Quand je test sur la boucle local, tout fonctionne bien, alors que
quand la communication se passe via internet, la deserialisation
echou.
Quelqu'un pourrait m'expliquer pourquoi ca ne fonctionne pas?
PS: je travail uniquement sur distribution linux.

Poser une question


Je te conseille de faire un checksum (ou un MD5) de la chaîne, au départ, et
à l'arrivée.
Cela te permettra de savoir si les données (la chaîne) ont bien été
transmises.
@-salutations
--
Michel Claveau
hash alors que via internet k'en ai un différent. En regardant la
taille de la chaine au départ et à l'arrivé, il me manque une
grosse partie de de mon paquet.
Ne serait ce pas à cause de ma boucle de récéption TCP sur le
serveur ?
res =""
while True:
rcv = receptionSocket.recv(8192)
res = res+rcv
if len(rcv)<8192: break
Perso, je fais plutôt des trucs du genre :
try:
while 1 :
if flagSTOP==True: return
data = conn.recv(1024)
if not data: break
buffer=buffer+data
except:
pass
Le flagSTOP est un signal, lorsque je travaille en multi-threading.
Je pense qu'il est préférable de travailler avec des trames de 1024 octets,
plutôt que 8192 (surtout par Internet, où les paquets sont méchamment
triturés en chemin)
Sinon, ça dépend aussi comment tu as ouvert tes sockets, et le nombre de
queues pour listen() (je met 1), et aussi le timeout, avec settimetout()
(qui l'aurait crû ?)
En espérant que ça puisse t'aider.
@-salutations
--
Michel Claveau
Ben oui je crois: tu n'es pas certain d'avoir reçu toutes tes infos.
Moi je reçois des objects de tailles différentes et passe la longueur en
paramètre.
def Receive(self, p_len):
l_data = ''
l_len = p_len
try:
while len(l_data) != l_len:
l_data += self.m_conn.recv(l_len)
if len(l_data) != l_len:
#print 'Still expecting data'
l_len -= len(l_data)
except:
self.m_conn.close()
return None
return l_data
hg
PS: si ton serveur ne connait pas la taille de l'objet à sérialiser,
alors change ton protocole et passe d'abord la taille de l'objet
"len(pickle....)" au serveur.
hg