Partage
  • Partager sur Facebook
  • Partager sur Twitter

Chat en python

Une boucle qui ne boucle pas tant que ça...

    28 mai 2011 à 19:19:15

    Salut les zéros,
    J'essaie de programmer un mini-chat en console en python. Le serveur semble fonctionner correctement, il me trouve les connexions, etc.
    Par contre, le client se lance, réussit à me connecter, envoie un message vide et fait comme s'il avait fini son boulot alors qu'il devrait boucler en attente de message à envoyer et à recevoir.
    J'ai cherché un peu partout et regardé des exemples de codes mais je ne vois pas pourquoi il me fait ça.

    Dans le doute voici le code du serveur:
    import SocketServer
    import sys
    
    connectes = []
    
    class Serveur(SocketServer.BaseRequestHandler):
        def handle(self):
            global connectes
            
            print "Connexion de ", self.client_address
            connectes.append(self.request)
            
            while True:
                donneesRecues = self.request.recv(8192)
                if not donneesRecues: break
                print 'Donnees envoyes par',self.client_address,' : ',donneesRecues
                i = 0
                for client in connectes:
                    client.sendall(donneesRecues)
                    
            connectes.remove(self.client_address)
            print "Deconnexion de ", self.client_address
    
    sys.stderr=sys.stdout
    
    print "Creation du serveur"
    serveur = SocketServer.ThreadingTCPServer(('',8881), Serveur)
    
    print "Attente de connexion client"
    serveur.serve_forever()
    


    et voici celui du client:
    import socket
    import sys
    import threading
    
    discuter = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    discuter.connect(('localhost',8881))
    print "Connecté au serveur"
    
    class Emission(threading.Thread):
            def __ini__(self):
                    threading.Thread.__init__(self)
            
            def run(self):
                    global discuter
                    while True:
                            reponse = discuter.recv(4096)
                            print "Serveur:", reponse
    
    class Reception(threading.Thread):
            def __init__(self):
                    threading.Thread.__init__(self)
                    
            def run(self):
                    donnees = raw_input('>>')
                    if donnees == 'exit': sys.exit()
                    else: return donnees            
                    while True:
                            if not donnees: break
                            for ligne in donnees.splitlines():
                                    discuter.sendall(ligne)
            
    emis = Emission()
    recv = Reception()
    emis.start()
    recv.start()
    
    #discuter.close()
    #print "Fermeture du serveur"
    


    Merci d'avance de votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      29 mai 2011 à 4:22:35

      Mmh. J'en suis pas sûr mais je crois que le problème viens de la ligne 25:
      sys.exite possède des parenthèses, ce qui signifie que le prog' doit l'executer, condition vrais ou pas...

      global discuter
      

      En pleine POO? ¤_¤
      • Partager sur Facebook
      • Partager sur Twitter
        29 mai 2011 à 15:28:11

        Bonjour et merci

        J'ai essayé de supprimer les lignes concernant le sys.exit, mais le problème reste le même.
        Pour le global, c'était un vestige oublié d'une première version.

        J'ai mis des print dans un peu partout pour voir ou il passait. Il passe bien la ou il faut (il m'affiche "je passe ici" et "je passe la"), mais un petit tour et puis s'en va...

        voila le nouveau code avec les print:
        import socket
        import sys
        import threading
        
        discuter = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        discuter.connect(('localhost',8881))
        print "Connecté au serveur"
        
        class Emission(threading.Thread):
                def __ini__(self):
                        threading.Thread.__init__(self)
                
                def run(self):
                        print "je passe ici"
                        donnees = raw_input('>>')
                        if donnees == 'exit': sys.exit()
                        else: return donnees            
                        while True:
                                if not donnees: print "je devrais m'arreter" #break
                                for ligne in donnees.splitlines():
                                        discuter.sendall(ligne)        
        
        class Reception(threading.Thread):
                def __init__(self):
                        threading.Thread.__init__(self)
        
                def run(self):
                        while True:
                                print "je passe la"
                                reponse = discuter.recv(4096)
                                print "Serveur:", reponse
                
        emis = Emission()
        recv = Reception()
        emis.start()
        recv.start()
        
        #discuter.close()
        #print "Fermeture du serveur"
        


        J'en ai profité pour inverser réception et émission, c'est plus logique comme ça...
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          29 mai 2011 à 20:09:42

          Ligne 17, tu fais un return si donnees vaut autre chose que 'exit' donc aucune donnée n'est envoyée puisque la fonction s’arrête là.
          • Partager sur Facebook
          • Partager sur Twitter
            30 mai 2011 à 2:29:07

            Pour sys.exit() utilise un fonction lambda.
            • Partager sur Facebook
            • Partager sur Twitter

            Chat en python

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown