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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    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
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    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
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    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
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

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

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    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

+ 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