IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Probleme de communication reseaux


Sujet :

Réseau/Web Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 428
    Points : 123
    Points
    123
    Par défaut Probleme de communication reseaux
    Bonjour,

    je ne suis pas un expert, mais j'essaye malgré les tutos, de réaliser une communication réseaux entre deux programmes.
    Ce programme n'est autre que deux fois le même, sur deux machines différentes.

    Dans le cadre de test j'ai créer deux fichiers présent sur chaque machine. L'un est un fichier serveur qui écoute et gère les connexion.
    L'autre est un fichier client.

    J'ai donc exécuter un fichier par machine, et j'arrive à me connecter, et du client à envoyer des messages au fichier serveur.
    Malheureusement je ne comprend pas comment le serveur peut envoyer un message au client et comment il peut faire la différence entre un client et un autre.

    pouvez vous m'aider svp? je vous met mes code de mes deux fichiers.

    Code client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import socket
     
    hote = "127.0.0.0"
    port = 12800
     
    connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion_avec_serveur.connect((hote, port))
    print("Connexion etablie avec le serveur sur le port {}".format(port))
     
    msg_a_envoyer = b""
    while msg_a_envoyer != b"fin":
        msg_a_envoyer = input("> ")
        # Peut planter si vous tapez des caracteres speciaux
        msg_a_envoyer = msg_a_envoyer.encode()
        # On envoie le message
        connexion_avec_serveur.send(msg_a_envoyer)
        msg_recu = connexion_avec_serveur.recv(1024)
        print(msg_recu.decode()) # Le encore, peut planter s il y a des accents
     
    print("Fermeture de la connexion")
    connexion_avec_serveur.close()
    Code serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import socket
    import select
     
    hote = ''
    port = 12800
     
    connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion_principale.bind((hote, port))
    connexion_principale.listen(5)
    print("Le serveur ecoute a present sur le port {}".format(port))
     
    serveur_lance = True
    clients_connectes = []
    while serveur_lance:
        # On va verifier que de nouveaux clients ne demandent pas a se connecter
        # Pour cela, on ecoute la connexion_principale en lecture
        # On attend maximum 50ms
        connexions_demandees, wlist, xlist = select.select([connexion_principale],
            [], [], 0.05)
     
        for connexion in connexions_demandees:
            connexion_avec_client, infos_connexion = connexion.accept()
            # On ajoute le socket connecte a la liste des clients
            clients_connectes.append(connexion_avec_client)
     
        # Maintenant, on ecoute la liste des clients connectes
        # Les clients renvoyes par select sont ceux devant etre lus (recv)
        # On attend la encore 50ms maximum
        # On enferme l appel a select.select dans un bloc try
        # En effet, si la liste de clients connectes est vide, une exception
        # Peut etre levee
        clients_a_lire = []
        try:
            clients_a_lire, wlist, xlist = select.select(clients_connectes,
                    [], [], 0.05)
        except select.error:
            pass
        else:
            # On parcourt la liste des clients a lire
            for client in clients_a_lire:
                # Client est de type socket
                msg_recu = client.recv(1024)
                # Peut planter si le message contient des caracteres speciaux
                msg_recu = msg_recu.decode()
                print("Reçu {}".format(msg_recu))
                client.send(b"5 / 5")
                if msg_recu == "fin":
                    serveur_lance = False
     
    print("Fermeture des connexions")
    for client in clients_connectes:
        client.close()
     
    connexion_principale.close()
    Je vous remercie par avance.
    Je vous remercie d'avance pour vos lumières.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Relisez votre code.
    Chaque connexion client acceptée va créer une socket dédiée à ce client là.
    Dans votre programme, cette socket est retournée ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        for connexion in connexions_demandees:
            connexion_avec_client, infos_connexion = connexion.accept()
            # On ajoute le socket connecte a la liste des clients
            clients_connectes.append(connexion_avec_client)
    Ces sockets sont représentées par des entiers que vous stockez dans la liste des "clients_connectes".

    Citation Envoyé par darkterreur
    J'ai donc exécuter un fichier par machine, et j'arrive à me connecter, et du client à envoyer des messages au fichier serveur.
    Malheureusement je ne comprend pas comment le serveur peut envoyer un message au client et comment il peut faire la différence entre un client et un autre.
    La liste "clients_connectes" ne sert qu'a indiquer à select.select la liste des sockets sur lesquelles on attend quelque chose.
    Lorsque le serveur a des données à lire pour le client X le numéro de socket correspondant est retourné par .select dans la liste "clients_a_lire".
    Pour chaque socket de cette liste, le serveur appelle .recv puis retourne un message via .send

    Tout est dans le code et est relativement bien commenté.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 428
    Points : 123
    Points
    123
    Par défaut
    Je vous remercie pour ces informations qui sont en effet semblable aux commentaires.

    Je me rend compte que ma question n'est pas si clair.

    une fois la connexion effectué le client peut saisir des informations dans la console et les envoyer au serveur.
    Mais je souhaiterai sur le serveur saisir des informations dans la console et les envoyer au clients.
    Mais actuellement le serveur ne réagit pas et n'envoi rien.

    Et donc la question se pose, pose si j'ai deux client connecté et que je veux parler que au clients 2.

    Je suppose que je dois arriver a identifier mon client dans "clients_connectes".

    Je vous remercie par avance.
    Je vous remercie d'avance pour vos lumières.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par darkterreur Voir le message
    une fois la connexion effectué le client peut saisir des informations dans la console et les envoyer au serveur.
    Mais je souhaiterai sur le serveur saisir des informations dans la console et les envoyer au clients.
    Mais actuellement le serveur ne réagit pas et n'envoi rien.
    Je ne vois pas comment réaliser cela simplement sans faire tourner le serveur et le dialogue utilisateur dans 2 threads différents.
    L'autre soucis est que "saisir des informations" et "les envoyer à un client X" suppose que le client s'attende à recevoir des données.
    Il y a plein de façons pour réaliser cela mais il faut d'abord clarifier un peu ce que vous voulez faire.

    Côté programmation, essayez de séparer le dialogue réseau et le dialogue clavier dans 2 threads différents côté client.
    Ce n'est pas nécessaire mais çà vous donnera des idées sur les difficultés à surmonter pour réaliser la chose côté serveur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 428
    Points : 123
    Points
    123
    Par défaut
    Bonsoir,

    Alors j'ai fini par avoir un bout de code qui fonctionne ou quand l'un des deux écris il se bloque jusqu'a la réponse de l'autre puis vis versa.

    Ensuite j'ai une seconde version avec des threads, ou normalement je peux gérer les multi message dans les deux sens. Alors si j'ai un thread du coté client cela fonctionne plutôt pas mal. Mais des que je rajoute un thread coté serveur. Mes message du coté serveur ne parvienne plus au client.

    Je pense que mon premier cas pourrais largement faire l'affaire.
    J'aimerai réaliser un jeux de carte sur deux poste. Et donc il me faudrait tour par tour envoyer des information client serveur.
    Je me demande si je peux envoyer un objet entre le client et le serveur?

    Je vous remercie par avance
    Je vous remercie d'avance pour vos lumières.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par darkterreur Voir le message
    Je me demande si je peux envoyer un objet entre le client et le serveur?
    Techniquement, on ne pourra transférer que des "bytes".
    Ces bytes pourront représenter l'état d'un objet.
    Et vous avez des bibliothèques genre pickle qui permettent de sérialiser objets en bytes.
    Ceci dit, cela ajoute des couches d'abstractions, et cela ne simplifiera la vie du programmeur que s'il sait ce qu'il fait.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Probleme de carte reseaux
    Par krushnik dans le forum Debian
    Réponses: 2
    Dernier message: 27/11/2006, 22h56
  2. [RunTime]Probleme de communication avec exec
    Par Zaitchev dans le forum Langage
    Réponses: 4
    Dernier message: 09/06/2006, 21h07
  3. Réponses: 8
    Dernier message: 15/05/2006, 15h54
  4. probleme de communication port série
    Par ben23 dans le forum MFC
    Réponses: 8
    Dernier message: 06/02/2004, 15h12
  5. [web] problème de communication
    Par Hermant dans le forum Web
    Réponses: 2
    Dernier message: 04/02/2003, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo