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:
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:
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:
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:
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() |