communication client/serveur avec python

communication client/serveur avec python - Python - Programmation

Marsh Posté le 30-07-2003 à 12:16:59    

J'ai un client et un serveur.
 
L'objectif est que le client envoie un gros message au serveur et que le serveur, une fois qu'il a récupéré le gros message, envoie un message au client.
 
Ca parait tout bete. Et bien ca fait 2 semaines que je suis dessus.
 
Le gros message envoyé par le client est bien recu par le serveur mais le serveur n'arrive pas a envoyer sa reponse qui est 'Msg Recu avec succès!'
 
Please help me!!!!
 
Le code serveur:
 
 

Code :
  1. import SocketServer
  2. import threading
  3. class Serveur(threading.Thread):
  4.    def __init__(self, ip, port):
  5.        print 'Nouvelle instance serveur'
  6.        threading.Thread.__init__(self)
  7.        self.ip=ip
  8.        self.port=port             def run(self):
  9.        print 'thread serveur coté PyServeur lancé'
  10.        addr=(self.ip,self.port)
  11.        server=SocketServer.ThreadingTCPServer(addr,HandlerClass)
  12.        print 'serveur en attente de connexions'
  13.        server.serve_forever()
  14. class HandlerClass(SocketServer.BaseRequestHandler):
  15.    def handle(self):
  16.        msgRecv=''
  17.        msgSend=''
  18.        print 'Got new connection!'
  19.        while 1:                       msgRecv=self.request.recv(1048)                       print 'MSG RECU:', msgRecv                       if not msgRecv:
  20.                print 'Dans break'
  21.                msgSend='Msg Recu avec succès!'
  22.                print 'msgSend envoyé!'
  23.                self.request.send(msgSend)
  24.                break                  print 'Done with connection'
  25. serveur=Serveur('127.0.0.1', 50008)
  26. threadServeur=serveur.start()
  27. le code client:
  28. from socket import *
  29. class ClientPyClient:
  30.    def __init__(self,ipPyServeur):
  31.        print 'nouvelle instance ClientPyClient'              self.ipPyServeur=ipPyServeur
  32.               def existeCmd(self):              clientPyClient=socket(AF_INET, SOCK_STREAM)
  33.        clientPyClient.connect((self.ipPyServeur,50008))
  34.        #msg est le gros message a envoyer.
  35.        #pour fair le teste il suffit de creer un fichier avec le nom 'aEnvoyer'
  36.        #avec avec plus de 2ko de texte.
  37.        msg=self.fichierToString('aEnvoyer')
  38.        print 'MSG A ENVOYER:'
  39.        print msg
  40.        clientPyClient.send(msg)
  41.        print 'message envoye!'
  42.        msgRecu=clientPyClient.recv(1024)
  43.        print 'MSG RECU:'
  44.        print msgRecu
  45.        clientPyClient.close()
  46.    def fichierToString(self, nomFichier):
  47.        obFichier=open(nomFichier, 'r')
  48.        fichierEnString=obFichier.read()
  49.        obFichier.close()
  50.        return fichierEnString
  51. client=ClientPyClient('127.0.0.1')
  52. client.existeCmd()

Reply

Marsh Posté le 30-07-2003 à 12:16:59   

Reply

Marsh Posté le 31-07-2003 à 11:47:53    

Ton message, il fait quelle taille en octets ???

Reply

Marsh Posté le 31-07-2003 à 17:27:43    

Remarque je comprends rien a ta méthode de traitement coté serveur...
Tu veux pas la remettre en forme ?

Reply

Marsh Posté le 31-07-2003 à 17:31:21    

j'ai pas lu ton code. moi quand je fais ce genre de chose, voilà comment je procède. j'ai une joli classe qui encapsule les sockets et qui fait passer les message avec pickle (dumps/loads) et un paramètre optionnel au constructeur pour faire gzip le flux en sus

Reply

Marsh Posté le 31-07-2003 à 17:34:59    

Bon c'est pas facile vu que les tabulations sont un peu en vrac, mais a priori je dirais que ton probleme viens de :
(je suppose pour la mise en forme...)

Code :
  1. while 1:
  2.     msgRecv=self.request.recv(1048)
  3.     print 'MSG RECU:', msgRecv
  4.     if not msgRecv:
  5.         print 'Dans break'
  6.         msgSend='Msg Recu avec succès!'
  7.         print 'msgSend envoyé!'
  8.         self.request.send(msgSend)
  9.         break
  10. print 'Done with connection'


 
Vu que msgRecv n'est pas None, ben ton if tu passes pas dedans et ton serveur il boucle...
Mais ca devrait afficher indefiniment :
"MSG RECU: blablabla"...
 
Donc si tu peux reformater ton code, on pourra certainement t'aider ! :whistle:
 
EDIT: je sais pas pourquoi il veut pas aligner le print 'Dans break'... :??:


Message édité par e_esprit le 31-07-2003 à 17:37:09
Reply

Marsh Posté le 31-07-2003 à 17:39:43    

Ah non j'ai compris...
Tu rappelle le recv sur le socket tant que t'as pas None...
C'est pas très propre, et surtout ca peut ne pas marcher :/
 
tes sockets ne serait-il pas en mode bloquant ???
Auquel cas msgRecv ne recoit jamais None mais attends indefiniment...

Reply

Marsh Posté le 01-08-2003 à 09:16:44    

ProToinou> Si ca te fais chier que j'essaye de t'aider a resoudre ton problème, faut le dire !!! :pfff:

Reply

Marsh Posté le 01-08-2003 à 11:25:01    

Ouai dsl les gars comme kristoph va vous l'écrire moi j'ai juste poster pour lui... car il n'avait pas encore de compte (c'est mon collègue, qui soit disant en passant n'a pas du tout le meme niveau que moi en python, lui il est bon, enfin c'est écrit sur son CV en tout cas)
Donc dsl de ne pas réagir à ce post :)
 

Reply

Marsh Posté le 01-08-2003 à 11:31:36    

salut tout le monde!
 
Protoinou c'est moi!  
 
Enfin non, j'ai demandé a ProToinou de poster ma question vu que je n'avais pas recu de confirmation d'inscription par l'admin du  forum et donc je ne pouvais rien poster.
 
Desolé pour vous repondre que maintenant, j'ai toujours beaucoup de boulot et donc pas beaucoup de temps.
 
J'ai compris mon problème tadam!
Enfin je crois. En tout cas j'ai une solution.
 
mon msgRecv=self.request.recv(1048) est a priori bloquant.  
 
Ce qu'il faut faire, c'est d'envoyer dans un premier message la taille du big message qui va suivre.
 
On a alors:
tailleRestanteDuGrosMessage = premier message
 
Ensuite le serveur fait un  
while 1:
  if tailleRestanteDuGrosMessage!=0:
    taillePaquet=min(1024,tailleRestanteDuGrosMessage)
    msgRecv=self.request.recv(taillePaquet)
    print 'MSG RECU:', msgRecv
    tailleRestanteDuGrosMessage=tailleRestanteDuGrosMessage - taillePaquet
    if tailleRestanteDuGrosMessage<0:
      tailleRestanteDuGrosMessage=-tailleRestanteDuGrosMessage
  else:
    print 'dans le break!'
    msgSend='Msg Recu avec succès!'
    print 'msgSend envoyé!'
    self.request.send(msgSend)
    break
print 'Done with connection'  
     
Voila!!!! La ca marche!!!
On ne fait plus de recv sans etre sur d'avoir encore quelque chose dans le buffer des messages recus.
 
Merci e_esprit t'etais dans le vrai avec ta derniere remarque.
 
Taz, c'est quoi cette methode avec pickle (dumps/loads)? Je ne connais pas. (au fait tu n'es pas le Taz d'Orsay?)
 

Reply

Marsh Posté le 01-08-2003 à 11:55:22    

OK, c'est bon.
 
Tu noteras aussi que ma premiere remarque etait exacte (la taille des messages est toujours le premier probleme que l'on rencontre quand on utilise les sockets). :o  
 
Sinon moi je fais plutot comme ca :


        msg = self.socket.recv(msg_size)
        while len(msg)<msg_size:
            msg += self.socket.recv(msg_size - len(msg))
        self.socket.sendall("Message recu avec succès" )

Reply

Marsh Posté le 01-08-2003 à 11:55:22   

Reply

Marsh Posté le 01-08-2003 à 16:12:13    

Ton petit code est bcp mieux que le mien.
 
Y'a un truc que je ne connais pas:
Qu'elle est la taille max qui peut etre recupere avec un seul "msg = self.socket.recv(msg_size)"  ?
 
 

Reply

Marsh Posté le 01-08-2003 à 17:04:07    

Chriss a écrit :

Ton petit code est bcp mieux que le mien.
 
Y'a un truc que je ne connais pas:
Qu'elle est la taille max qui peut etre recupere avec un seul "msg = self.socket.recv(msg_size)"  ?
 
 
 


Bah ca dépends de plein de choses...
C'est du a l'architecture reseau, a la taille des buffers de ta carte reseau, du protocole utilisé, de l'OS, de l'encombrement, etc.
Mais tu peux mettre un nombre tres tres grand, au pire tu recupereras pas tout, mais c'est pas grave puisque c'est toi qui le gere !
 
Je te conseille de lire ca :
Socket Programming HOWTO
Ils en parlent un peu...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed