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

PyQt Python Discussion :

socket python - envoyer un message du serveur au client


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 1
    Points : 1
    Points
    1
    Par défaut socket python - envoyer un message du serveur au client
    Bonsoir,

    Je suis débutant en python et je m'exerce en ce moment sur les socket, cependant j'ai un soucis:

    Ce que je veux faire : J'ai un serveur et un client, dès que le client se connecte au serveur il lui envoie une donnée (un message), le serveur recoie le message et en fonction du message reçu le serveur renvoie un message en particulier.

    J'arrive à envoyer un message du client au serveur mais pas du serveur au client, pourtant j'utilise la même methode pour envoyer un message du client au serveur et cela marche, j'aurais besoin d'aide, je vous remercie d'avance.

    mes codes :

    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
    import socket
     
     
    host, port = ('', 4444) # le serveur n'a pas besoin d'adresse car il na pas besoin de se connecter il demarre et ecoute
     
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #le premier socket est la varible, le deuxieme est le module socket que l'on instancie avec socket()
    socket.bind((host, port)) # on part du socket et avec la methode bind n associe le socket a une adresse,
     
    print("en attente de connection..")
     
    socket.listen(1) # le socket ecoute, jusqua 5 tentatives
    conn, adress = socket.accept()
     
    print (adress)
     
    data = conn.recv(1024) #con recoie grace à recv , 1024 est le buffer, tjr en multiple de deux
     
    data = data.decode("utf8") #decode la donnée reçu
    print("Message reçu : " + data + "\n")
     
    while True:
     
    if data == "bleu":
    print("bleu\n")
    del data
     
    data = "ok"
    data = data.encode("utf8") # j'encode la donnée text en utf8
    socket.sendall(data)
     
     
    if data == "rouge":
    print("Rouge\n")
     
    print("Veuillez patientez avant une nouvelle demande...\n")
     
    conn.close() #on ferme la connection
    socket.close()

    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
    22
    23
    24
    import socket
     
     
    host, port = ('127.0.0.1', 4444) #adresse du localhost et meme port que le serveur
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #le premier socket est la varible, le deuxieme est le module socket que l'on instancie avec socket()
     
    try :
    socket.connect((host, port)) #on connect le client au serveur
    print("\nConnection au serveur:\n")
     
    equipe = "bleu"
    equipe = equipe.encode("utf8") # j'encode la donnée text en utf8
    socket.sendall(equipe) # send envoie la donnee, sendall envoie toute la donnee
     
    del data
    data = conn.recv(1024) #con recoie grace à recv , 1024 est le buffer, tjr en multiple de deux
    data = data.decode("utf8") #decode la donnée reçu
    print("Message reçu : " + data + "\n")
     
    except:
    print("connection au serveur raté")
     
    finally:
    socket.close()

    Erreur :
    en attente de connection..

    ('127.0.0.1', 57559)

    Message reçu : bleu

    bleu

    Traceback (most recent call last):

    File "C:\Users\*****\Desktop\python\test\serveur.py", line 29, in <module>

    socket.sendall(data)

    OSError: [WinError 10057] Une requête d’envoi ou de réception de données n’a pas été autorisée car le socket n’est pas connecté et (lors de l’envoi sur un socket datagramme en utilisant un appel sendto) aucune adresse n’a été fournie

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    Bonsoir,

    1) Evitez au maximum les raccourci à la truelle du genre except (sans préciser l'erreur) : une erreur n'est pas "mauvaise", au contraire, elle peut vous indiquer de manière assez précise ce qui ne vas pas !
    2) Corollaire du 1), côté Client : le "del data" aurait dû retourner une erreur car data n'existe pas encore au moment où vous effectuez l'opération
    3) Toujours côté Client : juste en dessous du "del data", vous avez écrit conn.recv() ; la variable conn n'existe pas côté client
    4) Côté Serveur : là c'est l'inverse, vous écrivez socket.sendall() au lieu de conn.sendall()

    Pour éviter de splitter le code et de run sur deux terminaux distincts, j'ai lancé deux threads : un pour le client et un autre pour le serveur. Si vous n'êtes pas familier des threads, lancez sur deux terminaux différents

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    import threading # To run client and server on same script
    import time as tm # To make client wait until server is ok
     
    def server() :
        import socket
        host, port = ('', 4444)
        socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket.bind((host, port))
        print("en attente de connection..")
     
        socket.listen(1) # le socket ecoute, jusqua 5 tentatives
        conn, adress = socket.accept()
     
        print (adress)
     
        data = conn.recv(1024)
     
        data = data.decode("utf8") #decode la donnée reçu
        print("Message reçu : " + data + "\n")
     
        while True:
     
            if data == "bleu":
                print("bleu\n")
                del data
     
                data = "ok"
                data = data.encode("utf8") # j'encode la donnée text en utf8
                conn.sendall(data)
     
            if data == "rouge":
                print("Rouge\n")
     
                print("Veuillez patientez avant une nouvelle demande...\n")
     
                conn.close() #on ferme la connection
                socket.close()
     
     
    def client() :
        import socket
        host, port = ('127.0.0.1', 4444)
        socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
        try :
            socket.connect((host, port)) #on connect le client au serveur
            print("\nConnection au serveur:\n")
     
            equipe = "bleu"
            equipe = equipe.encode("utf8") # j'encode la donnée text en utf8
            socket.sendall(equipe) # send envoie la donnee, sendall envoie toute la donnee
     
    #        del data
            data = socket.recv(1024) #con recoie grace à recv , 1024 est le buffer, tjr en multiple de deux
            data = data.decode("utf8") #decode la donnée reçu
            print("Message reçu : " + data + "\n")
     
    #    except: print("connection au serveur raté")
        finally: socket.close()
     
    thread1 = threading.Thread(target=server)
    thread2 = threading.Thread(target=client)
     
    thread1.start()
    tm.sleep(1)
    thread2.start()

  3. #3
    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,

    Dans le serveur, il y a plusieurs types de sockets, celle sur laquelle le serveur écoute les demande de connexion de nouveaux clients et celles qui sont retournées par .accept (lorsque la demande d'un client est "acceptée").

    Dans votre code la socket du serveur est assignée à socket alors que celle du client est assignée à conn (que vous utilisez déjà pour lire juste avant).

    Pour le reste, il faut savoir un peu programmer avant de vouloir jouer avec les sockets et avoir trouvé un bon tuto. pour y apprendre comment çà fonctionne (sinon, vous allez écrire n'importe quoi sans même le savoir).

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

Discussions similaires

  1. sockets problème de messages entre serveur et client
    Par tonytony2018 dans le forum C++
    Réponses: 1
    Dernier message: 23/06/2018, 12h50
  2. envoye un message a serveur
    Par Jaafar_scorpion dans le forum API standards et tierces
    Réponses: 20
    Dernier message: 02/05/2011, 18h05
  3. Comment envoyer un message d'alerte au client?
    Par rezguiinfo dans le forum ASP.NET
    Réponses: 5
    Dernier message: 19/05/2010, 14h14
  4. échange message entre Serveur et client
    Par boukharyinfos dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 19/05/2009, 10h11
  5. Réponses: 6
    Dernier message: 22/09/2005, 10h21

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