Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

serialisation et réseau

7 réponses
Avatar
DarkPearl
Bonjour tout le monde,


J'ai un probleme avec la s=E9rialisation 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=E8re : "string_a_envoyer =3D pickle.dumps(dico)"


Sur le serveur, je recois le message et je le deserialise : "dico =3D
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.

7 réponses

Avatar
Méta-MCI
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
Avatar
DarkPearl
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
Avatar
Méta-MCI
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
Avatar
hg
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

Avatar
hg
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


Avatar
DarkPearl
res =""
while True:
rcv = receptionSocket.recv(8192)
res = res+rcv
if len(rcv)<8192: break


Bon je vous remercies. Ceci dit, j'ai trouvé la solution. C'etait
effectivement au niveau de la reception.
Je sais pas si vous vous rappelez vos cours sur les fenetres glissantes
TCP. Si oui alors vous comprendrez que je ne recois pas que des paquets
de 8192 (sauf le dernier avec ce qui reste)

Pour faire fonctionner la reception il suffit simplement de changer

if len(rcv)<8192: break

par

if len(rcv)==0: break

voila et merci
Avatar
jimy
DarkPearl a écrit le 14/10/2006 à 17h37 :
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.


En fait pickle ne peut marcher que dans l'environnement original a l'objet serialisé.
C'est tout con !
pour faire plus court il enregistre seulement les liens memoire et les noms dans son dump
je travaillait sur un projet recement et j'ai ete contraint de m'arreter a cause de ca ... je suis desormais en recherche d'un vrai serialisateur !