Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2080 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  communication client/serveur avec python

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

communication client/serveur avec python

n°471806
protoinou
Posté le 30-07-2003 à 12:16:59  profilanswer
 

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()

mood
Publicité
Posté le 30-07-2003 à 12:16:59  profilanswer
 

n°473016
e_esprit
Posté le 31-07-2003 à 11:47:53  profilanswer
 

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

n°473618
e_esprit
Posté le 31-07-2003 à 17:27:43  profilanswer
 

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

n°473624
Taz
bisounours-codeur
Posté le 31-07-2003 à 17:31:21  profilanswer
 

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

n°473630
e_esprit
Posté le 31-07-2003 à 17:34:59  profilanswer
 

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
n°473637
e_esprit
Posté le 31-07-2003 à 17:39:43  profilanswer
 

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...

n°474155
e_esprit
Posté le 01-08-2003 à 09:16:44  profilanswer
 

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

n°474303
protoinou
Posté le 01-08-2003 à 11:25:01  profilanswer
 

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 :)
 

n°474318
chriss
Posté le 01-08-2003 à 11:31:36  profilanswer
 

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?)
 

n°474341
e_esprit
Posté le 01-08-2003 à 11:55:22  profilanswer
 

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" )

mood
Publicité
Posté le 01-08-2003 à 11:55:22  profilanswer
 

n°474737
chriss
Posté le 01-08-2003 à 16:12:13  profilanswer
 

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)"  ?
 
 

n°474815
e_esprit
Posté le 01-08-2003 à 17:04:07  profilanswer
 

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...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  communication client/serveur avec python

 

Sujets relatifs
[python]import[ Serveur Apache et PHP ] Version ?
Application client - serveur[Windows] Nouveau développement d'un client à la Messenger
Communication inter-processusRéalisation d'un client SOAP en C# (serveur non .NET)
[C] Interruptions pour compter pulses haute frequ d'1 mini serveur web[SGBD] Base de données sans serveur ?
Plus de sujets relatifs à : communication client/serveur avec python


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR