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 :

Socket et recv [Python 2.X]


Sujet :

Réseau/Web Python

  1. #1
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut Socket et recv
    Bonjour,

    j'expérimente en python, sur l'envoi de donnée via TCP.
    J'ai pris un code simple pour la réception de donnée :

    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
    # Echo server program
    import socket
     
    HOST = ''                 # Symbolic name meaning all available interfaces
    PORT = 123                # Arbitrary non-privileged port
     
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.sendall(data)
        print('message received '+data)
    conn.close()
    La connexion se fait, j'ai un beau :
    pydev debugger: starting (pid: 4108)
    ('Connected by', ('127.0.0.1', 59383))
    message received Hello, world
    (oui, j'ai utilisé le debugger)

    Je constate à l'exécution (côté client) que j'ai l'erreur suivante :
    error: [Errno 10054] Une connexion existante a dû être fermée par l’hôte distant

    Donc en lançant le server en mode debug, je constate que le premier message est bien reçu et affiché, et qu'au tour de boucle suivant, le break s'applique (forcément, vu que je n'ai pas envoyé d'autre message). Je soupçonne que le problème vient de ce que je reprend un code utilisé pour récupérer 1 message quand je veux en envoyer plusieurs, périodiquement. De ce que j'ai compris de la doc, il faut que je configure la socket en mode bloquant via accept(), mais je n'ai pas compris comment faire.

    Merci pour votre aide.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai fait un petit tuto sur le sujet il y a longtemps, peut-être y trouveras-tu ce qui te manque (en particulier .accept).

    http://python.jpvweb.com/mesrecettes...rveur_tcp_mini
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Merci.
    Je ferais les tests lundi, mais le accept() est bon pour un seul message, d'où la nécessité de le mettre dans la boucle while ?
    Où est-ce qu'il est nécessaire de rouvrir le socket pour chaque nouveau message ? (d'où le close() dans la boucle while)
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    mais le accept() est bon pour un seul message, d'où la nécessité de le mettre dans la boucle while ?
    Où est-ce qu'il est nécessaire de rouvrir le socket pour chaque nouveau message ? (d'où le close() dans la boucle while)
    Regarde mon code! Oui, il y a une boucle while: c'est le principe du serveur. Il attend une requête, quand il en reçoit une, il renvoie la réponse et il attend de nouveau... A chaque boucle while, c'est accept qui ouvre la connexion client et close qui la ferme.

    J'avais essayé d'autres trucs, en particulier pour permettre d'accepter de nouvelles requêtes avant que la précédente ne soit terminée:

    http://python.jpvweb.com/mesrecettes...erveurs_divers

    C'est du Python 2, mais ça doit être facile à convertir.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

    Citation Envoyé par ManusDei Voir le message
    Donc en lançant le server en mode debug, je constate que le premier message est bien reçu et affiché, et qu'au tour de boucle suivant, le break s'applique (forcément, vu que je n'ai pas envoyé d'autre message). Je soupçonne que le problème vient de ce que je reprend un code utilisé pour récupérer 1 message quand je veux en envoyer plusieurs, périodiquement. De ce que j'ai compris de la doc, il faut que je configure la socket en mode bloquant via accept(), mais je n'ai pas compris comment faire.
    Normalement l'appel à conn.recv ne retourne une chaine vide que si le client a fait "close" de son côté.
    Sinon, çà attend d'avoir reçu quelque chose pour le retourner.
    note: le mode est bloquant par défaut.

    Si le client reçoit "[Errno 10054] Une connexion existante a dû être fermée par l’hôte distant", c'est parce que le serveur s'est planté ou qu'il a fermé la connexion.
    S'il s'était planté, vous devriez avoir vu passer un message d'erreur.

    Comme l'exemple de code que vous avez posté est (presque) un cut&paste de celui de la documentation, il devrait fonctionner. Mais l'instruction "print('message received '+data)" plantera en Python3: data étant de type "bytes".

    Postez le code du client et précisez la version de Python utilisée.

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Socket] - Problème recv avec UTF8
    Par JuS80 dans le forum Réseau
    Réponses: 4
    Dernier message: 17/04/2007, 09h46
  2. Socket : fonction recv.
    Par thieum74 dans le forum C++
    Réponses: 7
    Dernier message: 06/04/2006, 10h18
  3. [Socket] Send/Recv type double sur architectures différentes
    Par nicolas.pied dans le forum Réseau
    Réponses: 4
    Dernier message: 31/03/2006, 20h33
  4. [Socket] timeout recv
    Par zenux dans le forum C++
    Réponses: 2
    Dernier message: 11/03/2006, 17h27
  5. Réponses: 2
    Dernier message: 31/05/2005, 09h50

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