Probleme avec un Client Serveur de fichier
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 corrompus :( tandis 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)
Code:
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) |
Algo java du serveur:
Code:
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(); |
////////////////////////////////////FIN d'algo
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é?