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, erreur d'encodage?


Sujet :

Réseau/Web Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut Socket, erreur d'encodage?
    Bonsoir
    J'ai un probleme avec ma fonction d'envoie d'image de mon serveur vers mon client, pour chaque chaque fichier le 1er message est la taille de ce dernier et tres svt sur mon 2e fichier (parfois le 3e parfois jamais) j'ai une erreur de decodage.
    Console 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
    Connection...
    Tentative de connection...
    Connecter
    path:  Serveur/localhost-15555 File:  icone_0.ico
    Taille reçue non decoder: b'00010046'
    fichier supprimer
    path:  Serveur/localhost-15555 File:  icone_1.ico
    Taille reçue non decoder: b'ABB\xffABB\xff'
    Exception in thread Thread-1:
    Traceback (most recent call last):
      File "C:\Users\arthu\AppData\Local\Programs\Python\Python35-32\lib\threading.py", line 914, in _bootstrap_inner
        self.run()
      File "C:\Users\arthu\OneDrive\Projet Papa\Client\Client2.0.py", line 371, in run
        Recv_fichier(s, path, name)
      File "C:\Users\arthu\OneDrive\Projet Papa\Client\Client2.0.py", line 291, in Recv_fichier
        tailleImage = int(tailleImage.decode())     #On convertit la taille de l'image en entier (en octets)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
    La ligne 5 est normal mais pas la 8

    Console 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
    En écoute...
    [+] Nouveau thread pour 127.0.0.1 53024
    Connection de 127.0.0.1 53024
    En écoute...
     
    Requete: __Setup/3/[1, 0, 0, 0, 0, 0]
    ['[1', ' 0', ' 0', ' 0', ' 0', ' 0]']
    [1, 0, 0, 0, 0, 0]
    path:  Icones/Service-1/icone_0.ico
    Taille, Taille encoder: 00010046 b'00010046'
    path:  Icones/Service-1/icone_1.ico
    Taille, Taille encoder: 00010046 b'00010046'
    path:  Icones/Service-1/icone_2.ico
    Taille, Taille encoder: 00010046 b'00010046'
    path:  Icones/Service-1/icone_3.ico
    Taille, Taille encoder: 00010046 b'00010046'
     
    		 127.0.0.1 : 53024 	S1:  Bon  S2:  Bon  S3:  Bon  S4:  Bon 	Wait_Check:  3 Thread: 4
     
    		 127.0.0.1 : 53024 	S1:  Bon  S2:  Bon  S3:  Bon  S4:  Bon 	Wait_Check:  3 Thread: 4
    Client déconnecté...
    Fonction d'envoie Serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def Envoie_Fichier(clientsocket, path):
     
        print("path: ",path)
        fichierImage = open(path, "rb") 
        tailleImage = str(os.path.getsize(path))     #On récupère la taille du fichier image en octets que l'on convertit en chaine de caractères
     
        for i in range(8-len(tailleImage)):                 #On rajoute des 0 devant la taille jusqu'à que la chaine fasse 8 caractères
            tailleImage = "0"+ tailleImage
        print(tailleImage, tailleImage.encode())
        clientsocket.send(tailleImage.encode())                   #On a la taille de l'image, on l'envoie au client
        clientsocket.send(fichierImage.read())                    #On envoit le contenu du fichier
    Fonction reception 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
    def Recv_fichier(s, path, name):
     
        print("path: ", path, "File: ", name)    
        tailleImage = s.recv(8)                     #On récupère les 8 premier octets
        print(tailleImage)
        tailleImage = int(tailleImage.decode())     #On convertit la taille de l'image en entier (en octets) 
        contenuTelecharge = 0                       #Contenu téléchargé en octets
        if not os.path.exists(path):
            os.makedirs(path)
            print("Chemin creer")
     
        if os.path.exists(path + "/" + name) == True:
            os.remove(path + "/" + name)
            print("fichier supprimer")
     
        fichierImage = open(path + "/" + name,"xb")              #Le fichier qui va contenir l'image
     
     
        while contenuTelecharge < tailleImage:      #On a la taille de l'image, jusqu'à ce qu'on ait tout téléchargé
            contenuRecu = s.recv(1024)              #On lit les 1024 octets suivant
            fichierImage.write(contenuRecu)         #On enregistre dans le fichier       
            contenuTelecharge += len(contenuRecu)   #On ajoute la taille du contenu reçu au contenu téléchargé
     
        fichierImage.close()

  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,

    Relisez votre code et expliquez pourquoi il devrait fonctionner avec des images dont la taille n'est pas un multiple de 1024.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    j'ai remplacer:
    while contenuTelecharge <= tailleImage:
    par
    while contenuTelecharge <= tailleImage - len(str(tailleImage)):

    pour retirer les bit deja reçue dans la taille d'image, c'était ça? La ça marche (enfin pas vraiment mais c'est encore une autre histoire ^^, erreur de boucle dans le main)

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    rectification ça fonctionne quand j'envoie 4 fois mimage 0 mais plante sur la 3 quand j'envoie 0,1,2,3
    ...

  5. #5
    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 CraZy_U2P Voir le message
    pour retirer les bit deja reçue dans la taille d'image, c'était ça? La ça marche (enfin pas vraiment mais c'est encore une autre histoire ^^, erreur de boucle dans le main)
    Ce sont des bytes (ou des octets) et non des bits.
    Et non c'est pas çà: si vous n'avez pas ajouté quoi que ce soit à la taille du fichier transmis, pourquoi lui retirer quelque chose?

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

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Franchement je cherche, je test de nouveau truc, je ne trouve pas d'ou ça viens.....

  7. #7
    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 CraZy_U2P Voir le message
    Franchement je cherche, je test de nouveau truc, je ne trouve pas d'ou ça viens.....
    ça vient du 1024 de votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       while contenuTelecharge < tailleImage:      #On a la taille de l'image, jusqu'à ce qu'on ait tout téléchargé
            contenuRecu = s.recv(1024)              #On lit les 1024 octets suivant
            fichierImage.write(contenuRecu)         #On enregistre dans le fichier       
            contenuTelecharge += len(contenuRecu)   #On ajoute la taille du contenu reçu au contenu téléchargé
    Essayez de visualiser (avec des petits dessins) comment se passe le transfert de 2 fichiers de 800 octets.

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

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    j'ai envie de repondre que comme coter serveur je précise pas de taille, j'envoie tout d'un coups et coter client je reçoie par 1024 si le dernier morceau fait moins de 1024 il n'a pas de bit de bourrage pour attendre 1024 donc le second fichier mord sur le 1er? et donc quand je suis sensé lire la taille je suis en plein milieu du fichier
    ça me parrait bizarre vue que les icones qui passe sans buguer sont ok quand on les ouvrent

  9. #9
    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 CraZy_U2P Voir le message
    j'ai envie de repondre que comme coter serveur je précise pas de taille, j'envoie tout d'un coups et coter client je reçoie par 1024 si le dernier morceau fait moins de 1024 il n'a pas de bit de bourrage pour attendre 1024 donc le second fichier mord sur le 1er? et donc quand je suis sensé lire la taille je suis en plein milieu du fichier
    Voilà... c'est çà.
    Vous pouvez (essayer de) lire par paquets de 1024 tant que ce qui reste à lire est >1024.

    Citation Envoyé par CraZy_U2P Voir le message
    ça me parrait bizarre vue que les icones qui passe sans buguer sont ok quand on les ouvrent
    Probable que le format utilisé encode les dimensions de l'image dans le fichier lui même.
    Dans ce cas, les octets ajoutés à la fin ne seront pas accédés.
    note: une image est un fichier binaire. Les humains vont les ranger avec des extensions .ICO, .PNG, .JPG, ... mais les programmes bien écrits ne vont pas se baser sur l'extension du nom du fichier pour savoir comment interpréter le contenu du fichier. Et il y a des tas d'informations en plus de celles des valeurs des pixels stockés dans des "en-têtes" (hauteur et largeur entre autres). Votre façon d'expédier la taille du fichier à recevoir est une "en-tête": les données sont derrière.

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

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Tu veux pas venir remplacer mon prof de C avancer y a pas pire pédagogue que lui, tu lui demande de l'aide quand t bloquer et il recode tout car ta pas la meme methode que lui ^^
    bon j'y retourne du coups

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    je n’arrête pas de réécrire mes fonction j'en est marre mais je viens d'avoir une idée mais je ne trouve pas la solution. .send() ne pourrait il pas prendre un paramètre de taille pour ajouter automatiquement des bit de bourrage?

  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
    Citation Envoyé par CraZy_U2P Voir le message
    je n’arrête pas de réécrire mes fonction j'en est marre mais je viens d'avoir une idée mais je ne trouve pas la solution. .send() ne pourrait il pas prendre un paramètre de taille pour ajouter automatiquement des bit de bourrage?
    Il n'y a que ces lignes à revoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       while contenuTelecharge < tailleImage:      #On a la taille de l'image, jusqu'à ce qu'on ait tout téléchargé
            contenuRecu = s.recv(1024)              #On lit les 1024 octets suivant
            fichierImage.write(contenuRecu)         #On enregistre dans le fichier       
            contenuTelecharge += len(contenuRecu)   #On ajoute la taille du contenu reçu au contenu téléchargé
    pour y ajouter la logique: "lire par paquets de 1024 tant que ce qui reste à lire est >1024.".

    Ce qui suppose la création d'une variable "reste à lire" initialisée à "tailleImage" pour "calculer" ce qu'on va passer à s.recv suivant le cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    remaining = tailleImage
    while remaining > 0:
          data = s.recv(1024 if remaining > 1024 else remaining)
          fichierImage.write(data)
          remaining -= len(data)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    mon sauveur !
    bon maintenant plus qu'a revoir mon fichier de conf pour le client ma méthode est pas viable mais ça c une autre histoire.



    A bientôt

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

Discussions similaires

  1. [Socket]Erreur de compilation
    Par elmodeno dans le forum C++
    Réponses: 11
    Dernier message: 10/02/2007, 22h16
  2. socket : erreur avec bind()
    Par horkets dans le forum Réseau
    Réponses: 11
    Dernier message: 30/10/2006, 11h47
  3. [Socket] Erreur: NotSerializableException
    Par rvfranck dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 04/02/2006, 22h05
  4. [socket] erreur accept
    Par CaptainChoc dans le forum Réseau
    Réponses: 3
    Dernier message: 28/12/2005, 11h32
  5. [Socket] erreur de connexion
    Par coachbob44 dans le forum C++
    Réponses: 4
    Dernier message: 03/03/2005, 17h14

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