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?
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
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.
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
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
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
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
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
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û ?)
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
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.
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.
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.
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.
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
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.
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.
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.
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
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
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
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
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 !
DarkPearl a écrit le 14/10/2006 à 17h37 :
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.
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 !
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 !