Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python 2.4] Communication réseau

    20 novembre 2006 à 19:39:24

    Bonjour à tous et toutes, Zer0s de la communauté.
    Bon voila, je ne vais pas passer par quatre chemins, j'ais un souci (sinon, je ne posterai pas ici :p ):
    Comment faire pour que deux boucles fonctionnent en même temps ?

    Bien, ca, c'était la question basique. Voici maintenant l'explication en large, en long et en travers de mon problème avec le contexte.

    Je souhaite établir un connection local sur mon réseau, et ce entre un serveur et un client. J'aie donc pour cela créer deux fichier différent, l'un jouant le role du serveur, l'autre du client (voir plus bas). Jusqu'à présent, tout a bien fonctionné (j'ais, en fait, suivi le cours de Gérard Swinnen). Mais j'ais désiré poussé plus loin son exemple, en permètant d'écrire et de recevoir simultanément des messages, ce qui n'est pas possible avec l'exercice du cours.

    Voici tout d'abord les deux scripts du cour :

    Le fichier Serveur.
    # -*- coding: cp1252 -*-
    #

    # Définition d'un serveur réseau rudimentaire
    # Ce serveur attend la connexion d'un client, pour entamer un dialogue avec lui

    import socket, sys

    HOST = '0.0.0.0' # doit être remplacé par l'IP de la machine sur laquel est activé le serveur.
    PORT = 50000

    # 1) création du socket :
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2) liaison du socket à une adresse précise :
    try:
        mySocket.bind((HOST, PORT))
    except socket.error:
        print "La liaison du socket à l'adresse choisie a échoué."
        sys.exit()

    while 1:
        # 3) Attente de la requête de connexion d'un client :
        print "Serveur prêt, en attente de requêtes ..."
        mySocket.listen(5)

        # 4) Etablissement de la connexion :
        connexion, adresse = mySocket.accept()
        print "Client connecté, adresse IP %s, port %s" % (adresse[0], adresse[1])

        # 5) Dialogue avec le client :
        connexion.send("Vous êtes connecté au serveur DJ-Del. Envoyez vos messages.")
        msgClient = connexion.recv(1024)
        pseudo = 0
        while pseudo == 0:
            pseudo = connexion.recv(1024)
        connexion.send("pseudoRecu")
        print "Le client %s est connecté à ce serveur." % (pseudo)
        while 1:
            print "C>", msgClient
            if msgClient.upper() == "FIN" or msgClient == "":
                break
            msgServeur = raw_input("S> ")
            connexion.send(msgServeur)
            msgClient = connexion.recv(1024)

        # 6) Fermeture de la connexion :
        connexion.send("Au revoir !")
        print "Connexion interrompue."
        connexion.close()

        ch = raw_input("<R>erommencer / <T>erminer ? ")
        if ch.upper() == "T":
            break


    Le fichier Client.
    # -*- coding: cp1252 -*-
    #

    # Définition d'un client réseau rudimentaire
    # Ce client dialogue avec un serveur ad hoc

    import socket, sys

    HOST = '0.0.0.0' # doit être remplacé par l'IP de la machine sur laquel est activé le serveur.
    PORT = 50000

    # Demande d'un pseudo à l'utilisateur :
    pseudo = 0
    while pseudo == 0:
        pseudo = raw_input("Entrez un pseudo S-V-P :")

    # 1) création du socket :
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2) envoi d'un requête de connexion au serveur :
    try:
        mySocket.connect((HOST, PORT))
    except socket.error:
        print "La connexion a échoué."
        sys.exit()
    print "Connexion établie avec le serveur."

    # 3) Dialogue avec le serveur :
    msgServeur = mySocket.recv(1024)

    mySocket.send(pseudo)
    while 1:
        msg = mySocket.recv(1024)
        if msg == "pseudoRecu":
            break
    while 1:
        if msgServeur.upper() == "FIN" or msgServeur == "":
            break
        print "S>", msgServeur
        msgClient = raw_input("C> ")
        mySocket.send(msgClient)
        msgServeur = mySocket.recv(1024)

    # 4) Fermeture de la connexion :
    print "Connexion interrompue."
    mySocket.close()




    Et les deux mêmes fichiers mais retravaillé par mes soins, avec quelques petits ajouts :-° .

    Le fichier Serveur.
    # -*- coding: cp1252 -*-
    #

    # Définition d'un serveur réseau rudimentaire
    # Ce serveur attend la connexion d'un client, pour entamer un dialogue avec lui

    import socket, sys

    class Serveur:
        def __init__(self, nom, IP, PORT):
            HOST = IP
            PORT = PORT
            self.serveurName = nom
            self.flux = 0

            # 1) création du socket :
            self.mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            # 2) liaison du socket à une adresse précise :
            try:
                self.mySocket.bind((HOST, PORT))
            except socket.error:
                print "La liaison du socket à l'adresse choisie a échoué."
                sys.exit()

            while 1:
                self.flux = 1
                # 3) Attente de la requête de connexion d'un client :
                print "Serveur prêt, en attente de requêtes ..."
                self.mySocket.listen(5)

                # 4) Etablissement de la connexion :
                self.connexion, adresse = self.mySocket.accept()
                print "Client connecté, adresse IP %s, port %s" % (adresse[0], adresse[1])

                # 5) Dialogue avec le client :
                ph = "Vous êtes connecté au serveur %s." % (self.serveurName)
                self.connexion.send(ph)
                    # Réception du pseudo du client :
                self.pseudo = 0
                while self.pseudo == 0:
                    self.pseudo = self.connexion.recv(1024)
                self.connexion.send("pseudoRecu")
                print "Le client %s est connecté à ce serveur.\n" % (self.pseudo)

                print "Pour mettre fin à la connexion, taper <FIN>\n"
               
                # Mise en place de l'échange des messages :
                self.msgEnvoi()
                self.msgReception()

                while 1:
                    if self.flux == 0:
                        break

                # 6) Fermeture de la connexion :
                connexion.send("Au revoir !")
                print "Connexion interrompue."
                self.flux = 0
                connexion.close()
               
                ch = raw_input("<R>erommencer / <T>erminer ? ")
                if ch.upper() == "T":
                    break
                       

        def msgEnvoi(self):
            while self.flux:
                msgServeur = raw_input("Serveur >>> ")
                self.connexion.send(msgServeur)
               
        def msgReception(self):
            while self.flux:
                msgClient = self.connexion.recv(1024)
                if msgClient.upper() == "FIN":
                    self.flux = 0
                print self.pseudo+" >>> "+msgClient

    if __name__ == "__main__":
        DJ_DEL = Serveur("DJ-DEL", '192.168.1.9', 50000)


    Le fichier Client.
    # -*- coding: cp1252 -*-
    #

    # Définition d'un client réseau rudimentaire
    # Ce client dialogue avec un serveur ad hoc

    import socket, sys

    class Client:
        def __init__(self, IP, PORT):
            HOST = IP
            PORT = PORT
            self.flux = 0

            # Demande d'un pseudo à l'utilisateur :
            self.pseudo = 0
            while self.pseudo == 0:
                self.pseudo = raw_input("Entrez un pseudo S-V-P :")

            while 1:
                self.flux = 1
                # 1) création du socket :
                self.mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

                # 2) envoi d'un requête de connexion au serveur :
                try:
                    self.mySocket.connect((HOST, PORT))
                except socket.error:
                    print "La connexion a échoué."
                    sys.exit()
                print "Connexion établie avec le serveur."

                # 3) Dialogue avec le serveur :
                msgServeur = self.mySocket.recv(1024)
                print msgServeur
                    # Envoi du pseudo au serveur :
                self.mySocket.send(self.pseudo)

                while 1:
                    msg = self.mySocket.recv(1024)
                    if msg == "pseudoRecu":
                        break

                print "Pour mettre fin à la connexion, taper <FIN>\n"

                # Mise en place de l'échange des messages :
                self.msgEnvoi()
                self.msgReception()
               
                while 1:
                    if self.flux == 0:
                        break

                # 4) Fermeture de la connexion :
                print "Connexion interrompue."
                mySocket.close()

                ch = raw_input("<R>erommencer / <T>erminer ? ")
                if ch.upper() == "T":
                    break
           
        def msgEnvoi(self):
            while self.flux:
                msgClient = raw_input(self.pseudo+" >>> ")
                self.mySocket.send(msgClient)
               
        def msgReception(self):
            while self.flux:
                msgServeur = self.mySocket.recv(1024)
                if msgServeur.upper() == "FIN":
                    self.flux = 0
                print "Serveur >>> "+msgServeur

    if __name__ == "__main__":
        moi = Client('192.168.1.9', 50000)


    En espérant que vous pourrez trouver une solution à mon problème qui est, pour rappel : "Comment envoyer et recevoir des messages simultanément, sans devoir suivre l'ordre serveur-client-serveur-client etc." (Pour bien comprend, lancez tout d'abord le code du cour de Swinnen).

    Note : Il est possible d'essayer le programme sur la même machine, en activant les deux fichier dans des fenêtres différentes (avec le Command Line).
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 novembre 2006 à 19:45:43

      Une partie du cours de Swinnen parle justement de ça. Continue le ;)
      • Partager sur Facebook
      • Partager sur Twitter
        20 novembre 2006 à 19:49:04

        Ah... Génial alors^^ En fait, je n'ais pas été plus loin, je voulais voir si je maitrisait cette partie. Mais si il explique comment faire, ca va alors^^.

        Merci beaucoup pour cette précieuse information Bigloo. :D
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          20 novembre 2006 à 19:57:45

          D'ailleurs, déjà évoqué : Python, threads, sockets, et POO

          A (éventuellement) lire après le Swinnen bien sûr.
          • Partager sur Facebook
          • Partager sur Twitter
            20 novembre 2006 à 20:45:56

            Tien d'ailleur, si tu veux faire du multithread, tu devrait utiliser ce qui est déjà intègré au module comme dans mon post ici. C'est bien plus approprié et ta classe, ça te montre comment la rendre un peu plus... utile ;)


            Bisous, Nyu
            • Partager sur Facebook
            • Partager sur Twitter

            [Python 2.4] Communication réseau

            × 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