Bonjour,
Je débute avec Python, et je rencontre une difficulté dans l'utilisation de socket (client):
J'ai un serveur qui écoute sur un port particulier. Les échanges avec lui se font selon le schéma suivant :
envoi vers le serveur :
mot_cle [option]
Le mot-cle est sur 4 caractères, l'option est facultative et dépend de la commande choisie
réponse du serveur :
code_retour-données
code_retour-données
code_retour données
le code_retour est une valeur numérique sur 3 caractères. La réponse tient en une ou plusieurs lignes, la dernière étant différenciée par un espace à la place du tiret entre le code retour et les données.
Mon problème est le suivant :
après la connexion à la socket, le message d'accueil arrive parfois en entier, parfois non. Dans ce dernier cas, une lecture supplémentaire avec recv me donne la suite du message. Ce qui est bizarre, c'est que ce comportement est aléatoire. Pourtant, les messsages sont brefs (80 car max par ligne). Du coup, tous les messages de retours suivants sont décalés par rapport aux commandes d'envoi (send).
Voici un extrait de mon code :
******************debut de l'extrait de code**************
******************fin de l'extrait de code**************
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(10.) try: s.connect((HOST, PORT)) except: print "erreur de connexion au serveur" else: rep=s.recv(1024) print "Connecté au serveur" s.send("CMD1\r\n") rep = s.recv(1024).strip('\r\n') s.send("CMD2\r\n") rep = s.recv(1024).strip('\r\n') s.send("CMD3\r\n") rep = s.recv(1024).strip('\r\n')
En résumé, la ligne contenant recv qui suit le send avec CMD1 renvoie souvent (mais pas toujours) la fin du message d'accueil alors que l'intégralité devrait être envoyée dans la branche "else" du "try".
En faisant la même opération avec telnet <host> <port>, le comportement est correct (un message complet pour chaque commande).
Quelqu'un aurait-il une idée ? Qu'ai-je raté dans la compréhension du module socket ?
Merci par avance de votre aide (et d'avoir eu la patience de lire jusque là
Olivier.
Partager