Buffer d'ecriture fichier problème
Bonjour, j'ai codé une application qui transfert des fichiers du client au servuer en utilisant les socket, cependant j'ai un petit problème, avant toute chose, voici les codes:
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 25 26 27 28 29 30 31 32 33
| public void run() {
// TODO Auto-generated method stub
try {
System.out.println("thread client lance");
while((instruction = in.readLine()) != null) {
if(Pattern.matches("^copier>.+$", instruction)) { //si on demande de copier
Pattern p = Pattern.compile(">");
String[] item = p.split(instruction); //on isole le chemin du fichier
File fichier = new File(item[1]);
if(fichier.exists()) {
long taille = fichier.length(); //on obetient la taille du fhichier
reader = new FileInputStream(fichier);
int nbreoctet = 0;
byte[] tab = new byte[1024]; //preparation des variables pour l'envoie du fichier
instruction = (String) instruction+":"+taille;
out.write(instruction+"\n"); //on renvoie l'instruction au serveur avec la taille en plus
out.flush();
Thread.sleep(1000);
while((nbreoctet = reader.read(tab)) != -1) {
client.getOutputStream().write(tab, 0, nbreoctet);
client.getOutputStream().flush();
}
System.out.println("Transfert terminé");
}
else
System.out.println("le fichier n'existe pas");
}
}
}catch(Exception e) {e.printStackTrace();}
} |
et le serveur:
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public void run() { //tout ce qui est envoyé par le client est receptioné ici
// TODO Auto-generated method stub
try {
while((instruction = in.readLine()) != null) { //attente des instructions clientes
if(Pattern.matches("^copier>.+$", instruction)) { //si on a demande au client de copier
Pattern M = Pattern.compile("\\\\"); //on s'adapte au systeme windows ou linux
String[] nom = M.split(instruction); //on isole le nom du fichier seul
File fichier = new File(nom[nom.length-1]);
Pattern P = Pattern.compile(":");
String chaine[] = P.split(instruction); //on recupere la taille
long taille = Long.valueOf(chaine[chaine.length-1]).longValue(); //on met la taille du fichier dans une variable int
long tailletotal = 0; //la totalite des donne transferes
BufferedOutputStream writerfichier = new BufferedOutputStream(new FileOutputStream(fichier)); //buffer vers le fichier
byte[] tab = new byte[1024];
int nbreoctet; //on prepare les variables pour le transfert de fichier
System.out.println("Debut du transfert");
System.out.println(taille);
while(tailletotal < taille) { //on fait la boucle pour enregistrer les donne dans le fichier
nbreoctet = client.getInputStream().read(tab);
writerfichier.write(tab, 0, nbreoctet);
writerfichier.flush();
tailletotal = tailletotal + nbreoctet;
}
writerfichier.flush();
writerfichier.close();
System.out.println("le transfert du fichier s'est deroule avec succes");
System.out.println("fichier recu: "+nom[nom.length-1]+" de l'adresse: "+client.getInetAddress());
}//fin de la boucle de copie
else
System.out.println("le client a tente d'envoyer une instruction inconnue");
}
}catch(Exception e) {e.printStackTrace(); }
} |
Je n'ai mis que les methodes run le reste etant sans importance.
Maintenant le problème, c'est qu'il m'affiche bien des 2côtés que le transfert et terminé et u'il s'est déroulé avec succès, cependant, le fichier qui a été copier est vide.
En gros si je copie:
C:\colorbox.log
j'aurai un fichier colorbox.log vide dans le dossier de l'appli.
Quelqu'un sait il d'ou vient le problème?
Merci d'avance