GNT sans publicité, site mobile, fonctionnalitées exclusives...

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.
Lire les 7 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Méta-MCI
Le #565985
Bonsoir !

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
DarkPearl
Le #565984
Alors au niveau du Hash SHA, comme prévu, en local j'obtiens le meme
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
Méta-MCI
Le #565702
Bonsoir !

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
hg
Le #565701
DarkPearl wrote:
Alors au niveau du Hash SHA, comme prévu, en local j'obtiens le meme
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



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

hg
Le #565700
hg wrote:
DarkPearl wrote:
Alors au niveau du Hash SHA, comme prévu, en local j'obtiens le meme
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



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


Publicité
Suivre les réponses
Poster une réponse
Anonyme