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 :

Envoie de fichiers par les sockets [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut Envoie de fichiers par les sockets
    Bonjour, quand le code ouvre des documents textes il fonctionne mais quand j'essaie avec des images que j'ouvre en binaire ça ne fonctionne plus

    voici le code de l'envoyeur :
    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
    67
    68
    69
    70
    71
    72
    73
     
    """
    coded by Programind
    """
    import socket
    import time
     
    hote = 'localhost'
    port = 12800
     
     
     
    print("Verification...")
    start_time = time.time()
    f = open("image.png",'rb')
    fich = f.read()
    f.close()
    interval = time.time() - start_time
    print("Executé en {} seconde".format(round(interval)))
    print()
     
     
     
    print("Chargement du fichier...")
    start_time = time.time()
    liste = []
    for loop in fich:
        liste.append(str(loop).encode())
    interval = time.time() - start_time
    print("Executé en {} secondes".format(round(interval)))
    print()
     
     
     
    print("Preparation pour l'envoi...")
    start_time = time.time()
    nb = 0
    nb2 = 1024
    ct = -1
    temp = ''
    fichier = []
    while ct!=len(liste):
        ct += 1
        if nb<nb2:
            temp += liste[nb].decode()
            nb += 1
        elif nb==nb2:
            fichier.append(temp)
            temp = ''
            nb2 += 1024
            if nb2>len(liste):
                nb2 = len(liste)
            nb += 1
    interval = time.time() - start_time
    print("Executé en {} secondes".format(round(interval)))
    print("Taille du fichier : {} Ko".format(len(fichier)))
    print()
     
     
     
    start_time = time.time()
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conn.connect((hote, port))
    print("Connexion établie avec le serveur ({}) sur le port {}".format(hote, port))
     
    for loop2 in range(len(fichier)):
        conn.send(fichier[loop2].encode())  
     
    print("Fermeture de la connexion")
    conn.send(b'')
    conn.close()
    interval = time.time() - start_time
    print("Executé en {} secondes".format(round(interval)))
    et le code du receveur :
    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
     
    """
    coded by Programind
    """
    import socket
     
    port = 12800
     
    f = open("image2.png",'wb')
    f.write(b'')
    f.close()
     
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conn.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    conn.bind(('', port))
    conn.listen(5)
    print("Le serveur écoute à présent sur le port {}".format(port))
    ccl, infos_connexion = conn.accept()
    print("Transfert en cours...")
     
    with open("image2.png",'ab') as f:
        while True:
            msg = ccl.recv(1024).decode()
            if msg!='':
                f.write(bin(int(msg)))
            else:
                f.close()
                print("Arret de la connexion")
                ccl.close()
                conn.close()
                break
    Je comprend pas où sont les problème et je m'y connais très peu en binaire dans python.

  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,

    Citation Envoyé par l1nux Voir le message
    Je comprend pas où sont les problème et je m'y connais très peu en binaire dans python.
    Ce que vous lisez d'un fichier ouvert en mode binaire seront des "bytes" que vous pouvez directement transférer via socket.send.
    Sachant cela, la question est de savoir quel est l'intérêt d'ouvrir un fichier en mode texte pour faire ce transfert: en mode binaire, pas besoin d'encode/decode et de toutes façons, vous voulez transférer un "contenu" pas l'utiliser.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Merci de votre réponse rapide,
    si j'ai bien compris je n'ais pas besoin d'encoder mon fichier l'or de l'envoie et je peux l'envoyer sans l'ouvrir ?

  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
    Salut,

    Citation Envoyé par l1nux Voir le message
    si j'ai bien compris je n'ais pas besoin d'encoder mon fichier l'or de l'envoie et je peux l'envoyer sans l'ouvrir ?
    Si j'ai écrit "un fichier ouvert en mode binaire", c'est qu'il va bien falloir l'ouvrir...

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    du coup j'ai fait ça pour l'envoyeur:
    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
     
    """
    coded by Programind
    """
    import socket
    import time
     
    hote = 'localhost'
    port = 12800
     
     
     
    start_time = time.time()
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conn.connect((hote, port))
    print("Connexion établie avec le serveur ({}) sur le port {}".format(hote, port))
     
    with open("image.png",'rb') as f:
        conn.send(f.read())
    f.close()
     
    print("Fermeture de la connexion")
    conn.send(b'')
    conn.close()
    interval = time.time() - start_time
    print("Executé en {} secondes".format(round(interval)))
    et ça pour le receveur :
    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
     
    """
    coded by Programind
    """
    import socket
     
    port = 12800
     
     
     
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conn.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    conn.bind(('', port))
    conn.listen(5)
    print("Le serveur écoute à présent sur le port {}".format(port))
    ccl, infos_connexion = conn.accept()
    print("Transfert en cours...")
     
    with open("image2.png",'ab') as f:
        while True:
            msg = ccl.recv(1024)
            if msg!='':
                f.write(msg)
            else:
                f.close()
                print("Arret de la connexion")
                ccl.close()
                conn.close()
                break
    Sauf que je n'arrive pas à couper la connexion.

  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
    Salut,

    Citation Envoyé par l1nux Voir le message
    Sauf que je n'arrive pas à couper la connexion.
    Relisez la condition d'arrêt côté serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if msg!='':
                f.write(msg)
            else:
                f.close()
    comme msg c'est des "bytes" et non des "str" il faut tester len(msg) ou comparer à b''.

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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    D'accord merci beaucoup pour votre aide mais j'ai une dernière question: est-ce qu'il y a un moyen pour accélérer l'exécution du code côté receveur parce que je le trouve assé lent.

    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
     
    """
    coded by Programind
    """
    import socket
     
    port = 12800
     
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conn.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    conn.bind(('', port))
    conn.listen(5)
    print("Le serveur écoute à présent sur le port {}".format(port))
    ccl, infos_connexion = conn.accept()
    print("Transfert en cours...")
     
    with open("ds2.zip",'ab') as f:
        while True:
            msg = ccl.recv(1024)
            if msg!=b'':
                f.write(msg)
            else:
                f.close()
                print("Arret de la connexion")
                ccl.close()
                conn.close()
                break

  8. #8
    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 l1nux Voir le message
    est-ce qu'il y a un moyen pour accélérer l'exécution du code côté receveur parce que je le trouve assé lent.
    C'est lent est trop subjectif.
    Utilisez "localhost" si vos transferts sont "locaux" (mais une copie ira bien plus vite).
    Sinon essayez d'être moins gourmand côté taille des paquets: conn.send(f.read()) délègue tout le boulot au réseau alors que vous pourriez lire par paquet de 1024 ou de la MTU size (si vous la connaissez).

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Il faudrait que je fasse une boucle qui prenne 1024 éléments dans le fichier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    with open("ds.zip",'rb') as f:
        for i in range(len(f.read())):
            conn.send(f.read(1024))  
    f.close()
    mais le code est encore plus lent.

  10. #10
    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 l1nux Voir le message
    mais le code est encore plus lent.
    Sûr qu'avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       for i in range(len(f.read())):
            conn.send(f.read(1024))
    c'est pas terrible....

    En python, on peut écrire çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for b in iter(lambda: f.read(1024), b''):
         conn.send(b)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Pouvez vous m'expliquer votre code je ne comprend pas tout.

  12. #12
    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 et joyeux noël,

    Citation Envoyé par l1nux Voir le message
    Pouvez vous m'expliquer votre code je ne comprend pas tout.
    iter et lambda sont des fonctions/edxpressions de base du langage.

    Plus proche du C serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while True:
        b = f.read(1024)
        if not b:
           break
        conn.send(b)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Bonjour,
    Imaginons que l'image ne seoit pas compoé d'un multiple de 1024 bits.
    Que se passe-t-il ?
    Merci.
    Joyeux Noel

  14. #14
    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 l1nux Voir le message
    Imaginons que l'image ne seoit pas compoé d'un multiple de 1024 bits.
    Que se passe-t-il ?
    Vous pouvez tester par vous même...

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

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Je pense avoir compris : la variable lis les 1024 premières valeurs donc même s'il en reste moins de 1024 elle serons lues.
    Le code fonctionne parfaitement !
    Merci pour votre temps et vos réponses

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

Discussions similaires

  1. envoi de fichier par des Sockets java
    Par Maha Ing dans le forum MATLAB
    Réponses: 0
    Dernier message: 10/05/2014, 18h38
  2. Envoie de fichier par socket
    Par eracius dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 05/10/2007, 11h21
  3. Envoi de fichier par socket
    Par thebloodyman dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/08/2007, 17h07
  4. Envoi de fichier par socket
    Par dr_octopus74 dans le forum Réseau
    Réponses: 42
    Dernier message: 19/01/2007, 17h59
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

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