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

Python Discussion :

[PYTHON 2.X] Socket TCP Lecture/Ecriture


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut [PYTHON 2.X] Socket TCP Lecture/Ecriture
    Bonjour,

    Voici une nouvelle question dont je n'arrive pas à trouver une réponse précise.

    Je souhaite réaliser un client/serveur.

    Le client et le serveur devant lire/écrire simultanément. Je m'explique, je souhaite que le serveur écrive de façon évènementiel et qu'il lise de façon continue. Le client devra réalisé la même opération.

    J'ai de suite pensé au Thread mais est ce que cette solution est viable sachant que le serveur aura plusieurs clients ? A savoir donc que le serveur aurait 2 Thread par Client (un pour la lecture, l'autre pour l'écriture de facon évènementiel et donc attendre en boucle l'évènement déclencheur).

    Je vous remercie d'avance pour votre réponse.

    Je n'ai pas encore regardé sur internet mais si en complément certains connaissent la méthode pour accepter la connexion des clients en fonction de l'adresse mac(de préférence mais je ne suis pas sur que ce soit réalisable) ou ip...


    Cordialement Quentin.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    une autre façon d'appréhender la chose est d'utiliser des sockets non-bloquantes et de structurer send/receive autour de select.select()

    en revanche avec toutes ces fonctions on travaille en général à cheval sur IP et TCP/UDP, l'adresse MAC c'est le protocole en dessous, déjà filtrer sur la base de l'adresse MAC n'est pas une bonne idée (car on peut la modifier comme qui rigole) et ça ne pourra se faire programmatiquement parlant qu'à l'aide de raw sockets (donc root/admin), que tu ne souhaite probablement pas

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Le client et le serveur devant lire/écrire simultanément. Je m'explique, je souhaite que le serveur écrive de façon évènementiel et qu'il lise de façon continue. Le client devra réalisé la même opération
    En en terme de protocole vous allez traduire cela comment?
    Le tutoriel Python sur les sockets qui est un bon point de départ.

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

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Un grand merci pour ta réponse rapide.

    Je vais me contenter de faire un filtrage via IP du coup.

    Je n'ai par contre pas totalement compris ta réponse sur l'utilisation du select, et du protocole TCP/UDP .

    J'aurai souhaité la totalité en TCP, cela n'est pas possible avec la méthode select ?

    Aurais tu un exemple d'utilisation du select et d'une utilisation non-bloquantes. Si je me trouve à un instant X en train d'écrire je pourrais lire en même temps ? J'ai vu cette notion sur un site mais l'exemple ne me paraissait pas correspondre à mon besoin.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    En en terme de protocole vous allez traduire cela comment?
    Le tutoriel Python sur les sockets qui est un bon point de départ.

    - W
    Je pense répondre à côté de ta question mais le protocole utilisé devrait être du TCP pour l'écoute et l'écriture (les connexions étant Threadées)... Ma méthode n'est peut être pas la bonne mais j'attends vos propositions sachant que je ne fermerais jamais la connexion hors-mi si le client se déconnecte

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par quentinb56 Voir le message
    Je pense répondre à côté de ta question mais le protocole utilisé devrait être du TCP pour l'écoute et l'écriture (les connexions étant Threadées)... Ma méthode n'est peut être pas la bonne mais j'attends vos propositions sachant que je ne fermerais jamais la connexion hors-mi si le client se déconnecte
    TCP, est un protocole de transport qui va servir à échanger des informations entre vos clients et le serveur. Et ces informations, il va falloir les découper en messages qui vont constituer un dialogue (autre façon de voir "protocole") qui fera que clients et serveurs pourront se parler.
    Un protocole populaire est par exemple HTTP.
    Vous pouvez en inventer un à vous, mais s'il n'est pas décrit, pas facile de le coder...

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

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par quentinb56 Voir le message
    Je vais me contenter de faire un filtrage via IP du coup.
    à ce stade il est important de comprendre comment fonctionne la pile réseau et les fonctions userland mises à disposition, à ton niveau ce que tu vas pouvoir faire c'est accepter la connexion, et si l'IP distante ne te plait pas tu peux toujours y mettre fin, ça n'est pas vraiment la même chose que de refuser la connexion

    Je n'ai par contre pas totalement compris ta réponse sur l'utilisation du select, et du protocole TCP/UDP .
    select() c'est bien, quand t'as compris le principe ça rend le code très clair je trouve

    quant à "la totalité en TCP" (wat ?) une connexion c'est au sens TCP (sockstream), d'IP tu peux préciser l'adresse destination et de TCP tu peux spécifier le port de destination pour le moins, c'est en général largement suffisant, une fois la connexion établie tu peux accéder en lecture à tout un tas d'autres infos sur la socket c'est pas un souci, et ce que tu read/write concrètement dans la socket, c'est la couche applicative, au dessus de TCP donc (au niveau HTTP par exemple)

    select() c'est juste une façon différente de gérer les read/write, le principe c'est que la fonction te renvoie la liste des sockets sur lesquelles y'a quelque chose à lire, donc pour chaque socket de la liste il suffira de faire un read() dessus qui de fait ne restera pas bloqué, idem pour les write en gros

    enfin pour ce qui est de "lire et écrire en même temps", ça n'existe évidement pas, de manière atomique l'ordi n'effectue toujours qu'une seule tâche à la fois, en revanche grâce à select() tu peux par exemple avoir une liste des sockets en lectures et une liste des sockets prêtes en écritures, et donc traiter lecture & écriture dans le même tour de boucle while

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    en revanche avec toutes ces fonctions on travaille en général à cheval sur IP et TCP/UDP
    Ma réponse concernait ton message ci-joint. Je ne souhaite pas utiliser d'UDP et mon protocole de transport sera totalement en TCP.

    Si vous pouviez me fournir un exemple basé sur l'exemple du site avec une communication bi-directionnelle simultanée en TCP... via la méthode du select()

    Si vous avez une source d'un exemple sur le protocole HTTP et un protocole inventé également je suis preneur pour bien y dissocier les différences.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Mes questions rejoignent les questions sur le sujet suivant : https://www.developpez.net/forums/d1...b-python-html/

    Je souhaite réaliser un serveur web en python et en fonction des méthodes que je reçois il communiquera avec les différents clients qui lui sont associés.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    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 écoute à présent sur le port {}".format(port))
     
    serveur_lance = True
    clients_connectes = []
    while serveur_lance:
        # On va vérifier que de nouveaux clients ne demandent pas à se connecter
        # Pour cela, on écoute 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 connecté à la liste des clients
            clients_connectes.append(connexion_avec_client)
     
        # Maintenant, on écoute la liste des clients connectés
        # Les clients renvoyés par select sont ceux devant être lus (recv)
        # On attend là encore 50ms maximum
        # On enferme l'appel à select.select dans un bloc try
        # En effet, si la liste de clients connectés est vide, une exception
        # Peut être levée
        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 à lire
            for client in clients_a_lire:
                # Client est de type socket
                msg_recu = client.recv(1024)
                # Peut planter si le message contient des caractères spéciaux
                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()
    Un exemple de code qui se base sur le select mais uniquement pour de la lecture, il me faudrait la même chose avec de l'écriture (à l'appui d'une touche par exemple)

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par quentinb56 Voir le message
    Un exemple de code qui se base sur le select mais uniquement pour de la lecture, il me faudrait la même chose avec de l'écriture (à l'appui d'une touche par exemple)
    Si vous avez compris comment çà fonctionne pourquoi ne pas essayez de l'écrire vous même? De toutes façons, il va bien falloir que vous codiez pour réaliser votre projet...
    note: plus grand monde ne développe sous Python 2.6.

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

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous avez compris comment çà fonctionne pourquoi ne pas essayez de l'écrire vous même? De toutes façons, il va bien falloir que vous codiez pour réaliser votre projet...
    note: plus grand monde ne développe sous Python 2.6.

    - W
    Merci de cette remarque je n'étais pas sur de devoir développer ! tu éclaircis grandement ma problématique de base qui était je le rappel : l'écriture/lecture simultanée.

    Je ne demande pas qu'on réalise mon projet mais qu'une âme charitable qui ne daigne pas rabaisser les autres membres fournissent un exemple concret d'une utilisation de la méthode select dont je n'ai trouvé aucunes utilisations jusqu'à présent du besoin exprimé plutôt.

    L'exemple que j'ai posté précédemment montrait bien la lecture de la totalité des clients et cette exemple ne répond en rien à ma question de départ qui est l'écriture/lecture.

    Quant à la version de python, libre à moi et à mes crontaintes ... Si la techno ne te correspond pas je comprendrais et ne te retiendrais pas plus longtemps.

Discussions similaires

  1. [PYTHON/FORTRAN ( f2py )] Lecture ecriture de fichier
    Par squallmrs dans le forum Interfaçage autre langage
    Réponses: 7
    Dernier message: 28/06/2012, 08h48
  2. Réponses: 6
    Dernier message: 08/05/2009, 11h56
  3. probleme lecture/ecriture socket
    Par joubiyann dans le forum C#
    Réponses: 1
    Dernier message: 31/03/2009, 09h56
  4. [socket]taille chaîne-temps lecture/Ecriture
    Par safisafi dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/02/2009, 18h42
  5. C -> Perl : Lecture ecriture sur des Sockets
    Par caesarvanou dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 05/05/2006, 11h20

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