Partage
  • Partager sur Facebook
  • Partager sur Twitter

[HELP] Pour un module réseau réutilisable

chat, mini jeux en reseau !

    25 mai 2011 à 17:44:13

    Bonjour,
    J'ai pour projet de créer un module contenant plusieurs classes qui puisse permettre a mes programmes de fonctionner en reseau !
    Je voudrais dans un premier temps m'en servir pour créer un chat mais mon but principal est que le code soit un maximum réutilisable pour que je puisse l'adapter a l'envoi d'ordres a un programme distant et la connexion de plusieurs clients.
    J'ai bien lu les cours de Swinnen sur la partie reseau et dans la même optique je vais créer des Threads independants permettant l'envoie et la reception de messages simultanés
    Partie Serveur:
    Sur la partie serveur j'ai fait un thread qui tourne a l'aide d'une boucle sans fin en attente de connexion de nouveaux clients, il instanciera une autre classe qui receptionnera les messages du clients afin de le renvoyer a tous les autres. Chaque nouvelle connexion cliente sera sauvegardée dans un dictionnaire supprimée en fonction des connexions et des deconnexions des clients.

    Partie Client:
    Un thread d'émission de messages et un autre pour la reception de messages venant du serveur !

    Voici mon code:

    #!/usr/bin/python
    #-*- coding: Utf-8 -*-
    
    import threading, socket, sys
    
    ### Partie Serveur ###
    
    class ThreadConnexion(threading.Thread): # A Completer !
        "Tread instancié par le serveur pour chaque client a connecter"
        def __init__(self, boss, conn):
            "Initialisation du Thread"
            self.boss = boss
            self.connexion = conn 
    
        def run(self):
            "Relais entre le serveur et le client"
            nom = self.getname()
            while 1:
                msgClient = self.connexion.recv(1024).decode("Utf8")
                if not msgClient or msgClient.upper() == "FIN":
                    break
                print msgClient
                for cle in self.boss.connexions:
                    if cle != nom:
                        self.boss.connexions[cle].send(msgClient.encode("Utf8"))
    
    
    class ThreadClients(threading.Thread): # A Completer !
        "Tread Central du serveur qui recherche les nouvelles connexions"
        def __init__(self, boss, HOST, PORT):
            "Initialisation du Thread"
            threading.Thread.__init__(self)
            # Declaration des variables
            self.boss = boss
            self.HOST = HOST
            self.PORT = PORT
            self.connexions = {}
    
        def run(self):
            "Boucle perpetuelle attendant les connexions clients"
            mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                mySocket.bind((self.HOST, self.PORT))
            except socket.error:
                # Ajouter message (impossible d'utiliser le port XXXXX)
                sys.exit() # Voir si adéquate !
                pass
    
            # Ajouter message: Serveur pret !
            mySocket.listen(5)
            print "Le serveur est pret !" # Pour tester !
    
            # Attente de connexion des clients ...
            while 1:
                # Etablissement de la connexion
                connexion, adresse = mySocket.accept()
                th = ThreadConnexion(self, connexion)
                th.start()
                it = th.getName() # Donne un nom au client connecté
                self.connexions[it] = connexion # L'enregistre dans un dictionnaire
                # Dialogue avec le client !
                confirmation = "***OK***"
                connexion.send(confirmation.encode("Utf8"))        
            
    
    if __name__ == "__main__":
        HOST, PORT = "", 45011
        serveur = ThreadClients(None, HOST, PORT)
        serveur.start()
    


    #-*- coding: Utf-8 -*-
    
    import threading, socket, sys
    
    ### Partie Client ###
    
    class ThreadEmission(threading.Thread): # A Completer !
        "Tread gèrant l'émission des messages"
        def __init__(self, conn):
            "Initialisation du Thread"
            threading.Thread.__init__(self)
            self.connexion = conn # Socket de connexion
            
        def run(self):
            "Boucle perpetuelle qui attend l'emission de nouveaux messages"
            # Archaique pour le moment !
            message_emis = input()
            self.connexion.send(message_emis.encode("Utf8"))
    
    
    class ThreadReception(threading.Thread): # Normalement OK !
        "Tread gèrant la réception des messages"
        def __init__(self, conn):
            "Initialisation du Thread"
            threading.Thread.__init__(self)
            self.connexion = conn # Socket de connexion
    
        def run(self):
            "Boucle perpetuelle qui attend la reception de nouveaux messages"
            while 1:
                message_recu = self.connexion.recv(1024).decode("Utf8")
                if not message_recu or message_recu == "***FIN***":
                    break # Interromp la boucle
                else:
                    print message_recu
            th_E.stop() # Arret du thread d'émission !
            print u"Client arrêté. Connexion interrompue !"
            self.connexion.close() # Fermeture de la connexion !
    
    if __name__ == "__main__":
        HOST, PORT = "localhost", 45011
        connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            connexion.connect((HOST, PORT))
        except socket.error:
            print u"Connexion impossible sur le port:", PORT
            sys.exit()
        print u"Connexion établie avec le serveur !"
        # Initialisation des Threads E/S
        th_E = ThreadEmission(connexion)
        th_R = ThreadReception(connexion)
        # Démarage des threads
        th_E.start()
        th_R.start()
    


    A priori la connexion au serveur se passe bien, le problème viens de l'instanciation de la classe ThreadConnexion(), dès que je démare l'objet j'ai cette erreur:

    Exception in thread Thread-1:
    Traceback (most recent call last):
      File "C:\Python27\lib\threading.py", line 530, in __bootstrap_inner
        self.run()
      File "D:\Documents\Programation\Python\Projets d'entrainement\Chat Reseau(version graphique)\X_serveurReseau.py", line 58, in run
        th.start()
      File "C:\Python27\lib\threading.py", line 465, in start
        raise RuntimeError("thread.__init__() not called")
    RuntimeError: thread.__init__() not called


    Je ne comprend pas l'erreur !

    Merci de votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2011 à 18:37:37

      Tu as oublié un petit threading.Thread.__init__(self) dans l'__init__ de ta classe ThreadConnexion.
      • Partager sur Facebook
      • Partager sur Twitter
      yjltg.
        25 mai 2011 à 19:58:22

        Merci pour ta réponse, effectivement, je me suis tellement noyé dans mon code que je n'ai pas fais gaffe et vu que je n'ai pas compris l'erreur ... voila quoi !
        Je ressortirais peut etre le post plus tard si j'ai un autre probleme, moins bète ça serais pas mal :p
        @ +++ et merci encore !
        • Partager sur Facebook
        • Partager sur Twitter

        [HELP] Pour un module réseau réutilisable

        × 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