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 :

Transfert de données via socket / send - receive


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 13
    Points : 21
    Points
    21
    Par défaut Transfert de données via socket / send - receive
    Bonjour à tous,

    Je rédige ce post dans l'espoir que vous puissiez m'aider à résoudre le problème qui se présente à moi en ce moment, je m'explique.
    Dans mon programme en python, j'ai une interaction entre un client et un serveur, et avec eux deux, j'utilise des méthodes que j'ai créées qui envoient ou reçoivent des données.
    Les fonctions sont les suivantes :

    Méthode de réception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def receive(connexion): # connexion = socket 
        data = b''
        while True:
            result = connexion.recv(1024)
            if not result or result == b' ':
                break
            data += result
        if not data == b'':
            return data.decode()
        else:
            return ""
    Méthode d'envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def send(connexion, data): # connexion = socket; data = la chaine à envoyer
        encoded_data = data.encode()
        g = (encoded_data[i:i+1024] for i in range(0, len(encoded_data), 1024))
        for d in g:
            connexion.send(d)
        time.sleep(0.2)
        connexion.send(b' ')
    Donc en l'état actuel, j'envoie mon 'data' par paquet de 1024 octets, et une fois que le 'data' a été entièrement envoyé, j'envoie un espace afin de faire comprendre à celui qui reçoit que j'ai fini mon envoi.
    Mon problème est le suivant, je n'arrive pas à trouver une manière moins "brute" pour signaler la fin de 'data', que l'envoi de cet espace. J'ai cherché un caractère EOF, mais il n'en existe pas en Python d'après mes recherches.

    J'ai également vu sur plusieurs forums que certains utilisateurs utilisaient ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while True:
        data = conn.recv(1)
        #code
        if not data: 
            break
    Mais dans mon cas ça marche pas, mon 'conn.recv(1024)' attend toujours des données et il ne renvoie pas False.

    Merci d'avance pour votre aide, ou vos conseils,
    Bonne journée.

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

    Les sockets sont des streams de bytes: l'émetteur peut expédier ses données par paquet de 128 et le lecteur les récupérer par paquet de 1, 128, 256,...
    Si vous ne voulez pas lire jusqu’à recevoir un string vide signalant que l'émetteur à fait un "close" (=EOF) il va falloir découper ce "stream" en unités logiques disons "messages" et définir ce qui sera le début et/ou la fin d'un message.

    Vous pouvez dire que les messages:
    1. sont de longeurs fixe (exemple 80 bytes),
    2. se terminent par <CRLF>
    3. commencent par un nombre de bytes à lire


    Si vous ne dites rien c'est la panade.

    - W

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 13
    Points : 21
    Points
    21
    Par défaut
    Je n'arrive pas tout à fait à saisir l'idée que vous développez sous vos trois points, je comprend pas concrètement à quoi devrait ressembler les messages que j'enverrais.

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

    longueur 10 bytes, padding <Space>:
    se terminent par <CRLF>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    '12345\r\n'
    '6789\r\n'
    commencent par:
    Ceci dit, c'est peut être pas dans un forum de programmation Python qu'on trouvera les meilleures "astuces" pour faire de la programmation réseau.

    - W

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 739
    Points
    2 739
    Par défaut
    Citation Envoyé par Myokara Voir le message
    Donc en l'état actuel, j'envoie mon 'data' par paquet de 1024 octets, et une fois que le 'data' a été entièrement envoyé, j'envoie un espace afin de faire comprendre à celui qui reçoit que j'ai fini mon envoi.
    Mon problème est le suivant, je n'arrive pas à trouver une manière moins "brute" pour signaler la fin de 'data', que l'envoi de cet espace. J'ai cherché un caractère EOF, mais il n'en existe pas en Python d'après mes recherches.
    Salut,

    effectivement apparemment EOF n'est pas un caractère.
    en revanche dans la table ASCII, tu as d'autre caractères non affichables qui peuvent servir à marquer différents type de fin.
    par exemple, pour ton cas, il me semble que EOT (End Of Transmission: 0x04) pourrait faire l'affaire.

    après cette solution simple n'est valable que si c'est du texte que tu envoies, auquel cas il suffira d'ajouter le caractère "\x04" à la fin de ton flux. de l'autre coté il suffira d'attendre de rencontrer ce caractère pour repérer la fin du flux.

    si tu compte envoyer des données binaires, ça suffira pas et on pourra en reparler.

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

Discussions similaires

  1. échange donnée via Socket
    Par jaussiba dans le forum Langage
    Réponses: 9
    Dernier message: 03/06/2008, 11h17
  2. prog de transfert de donné via bluetooth
    Par lekakes dans le forum Windows
    Réponses: 0
    Dernier message: 28/02/2008, 18h27
  3. Envoi de données via socket
    Par Popeye63 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/10/2007, 13h05
  4. [VB.NET]transfert de données via modem
    Par stevsoft dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/07/2006, 17h04
  5. Transfert de fichier via sockets...
    Par damien99 dans le forum MFC
    Réponses: 8
    Dernier message: 19/02/2006, 14h41

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