Bonjour,
je réalise de le cadre de mes études un Client - Serveur de fichiers.
Le probleme: les fichiers BINAIRES envoyés de l'un vers l'autre sont corrompustandis que les fichiers .txt ne le sont pas.
Prenon la situation du transfére Client ->vers-> Serveur:
metton que le nom du fichier soit connu a l'avance (je vais pas mettre tout le code pour pas fair trop lourd)
algo java du client:(volontairement sans controle d'exception)
Algo java du 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 BufferedReader br = null; //Reader sur la socket PrintWriter pw = null; //Writer sur la socket FileInputStream fis = null; //Entrèe sur un fichier FileOutputStream fos = null; //Sortie sur un fichier File theFile = new File(filename); fileSize = theFile.length(); fis = new FileInputStream(theFile); // Envoi de la taille du fichier sur la socket pw.println(new Long((fileSize)).toString()); pw.flush(); for (long i=0;i<fileSize;i++){ pw.write(fis.read()); } pw.flush(); fis.close(); //a savoir que d'aprés la doc fis.read() renvoi un int compris en 0 et 65535 pour une valeur lu entre 0 et 0xffff (en gros que les octets sont interprétés comme des int)
////////////////////////////////////FIN d'algo
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 BufferedReader br = null; //Reader sur la socket PrintWriter pw = null; //Writer sur la socket FileInputStream fis = null; //Entrèe sur un fichier FileOutputStream fos = null; //Sortie sur un fichier fos = new FileOutputStream(filename); // Reception de la taille du fichier sur la socket long fileSize = Long.parseLong(br.readLine()); // Reception des octets. for (long i=0;i<fileSize;i++) fos.write(br.read()); fos.close();
Le souci c'est que les fichiers autre que txt sont corrompu alors j'ai fai un petit programme cpp pour comparait un a un les octets des deux fichier (celui avant et celui aprés transfére) et j'observe que les octets 0x9y et 0x8y avec y un caractére hexa quelconque, sont remplacer systématiquement par 0x3f
a noté également que tous les transfére d'un méme fichier correcte donnent des fichiers corompu identiques (donc les octet reçu ne sont pas du hasard)
comment fair pour transférer correctement les octets d'un fichier binaire, et ainsi restituer une copi parfaite du fichier de l'autre coté?
Partager