Problème envoi de données et message Client/serveur
Bonjour, je fais une application de stockage de fichiers client/serveur.
Et j'ai un problème que je ne comprend pas.
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
|
//utiliser par la partie cliente
public static void EnvoiFichier(String nomDeFichier, DataOutputStream outToServeur,BufferedReader inS) throws IOException, InterruptedException {
RandomAccessFile fic = null;
fic = new RandomAccessFile (nomDeFichier,"r");
byte[] buffer_send = new byte[1024]; // buffer de lecture dans le fichier
int fichierfini = (int)fic.length(); // == 0 lorsque le fichier aura été entièrement envoyé
while (fichierfini != 0){
//System.out.println("taille restante : "+ fic.getFilePointer());
int octets_lus = 0; // nombre d'octets lus
octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
if(fichierfini > 1024){
System.out.println("taille envoyé : " + buffer_send.length);
outToServeur.write(buffer_send); //envoie
}
else if(fichierfini < 1024){
System.out.println("taille envoyé : " + fichierfini);
System.out.println("Fin fichier LECTURE envoi fichier");
outToServeur.write(buffer_send,0,fichierfini);
}
outToServeur.flush();
inS.read(); //attente confirmation
fichierfini = (int) (fic.length() - fic.getFilePointer());
}
outToServeur.write("END".getBytes());
//outToServeur.writeBytes("END");
System.out.println("envoie du END");
outToServeur.flush();
fic.close();
} |
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
|
//utilisé par la partie serveur pour recevoir les fichiers
public static void ReceptFichier(String nomDeFichier, DataOutputStream sortie, InputStream entree) throws IOException {
try{
//System.out.println("ouverture du fichier1");
RandomAccessFile fluxSortie = new RandomAccessFile(nomDeFichier,"rw");
//System.out.println("ouverture du fichier2");
String message = "";
sortie.flush();
while (!message.equals("END")){
System.out.println("reception d'une partie");
// Creation d'un tampon de stockage
byte []buffer_receive = new byte[1024];
// Lecture du message sur le flux d'entree
int size_msg = 0;
size_msg = entree.read(buffer_receive, 0, buffer_receive.length); //en attente
System.out.println("taille reçu : " + size_msg);
if (size_msg >= 0){
message = new String(buffer_receive, 0, size_msg);
System.out.println(message);
}
if (!message.equals("END"))
{
fluxSortie.write(buffer_receive);
sortie.write("OK".getBytes());
System.out.println("pas la fin de fichier");
sortie.flush();
}
else if (message.equals("END"))
System.out.println("on est a la fin du fichier END");
}
System.out.println("Fin de receptfichier : fermeture du fichier");
fluxSortie.close();
}
catch (Exception e){}
} |
En effet, lorsque j'envoie un fichier texte tout se passe bien par contre quand je passe à un fichier plus gros comme une image, le message "END" envoyé par le client est compris dans la dernière partie du fichier que j'envoie (il devrait être envoyer séparément dans le prochain envoi), et je ne vois vraiment pas pourquoi. Par exemple j'envoie 592 bytes dans l'affichage taille reçu j'ai 595 (comprend donc les 3 bytes du "END", mais à la reception
Pourtant, le "END" est envoyé après la réception d'une confirmation par le serveur. Est ce que vous pourriez m'aider à trouver le problème s'il vous plaît ?
Edit:
J'ai reussi à le faire marcher sans trop savoir comment ... J'ai mi un writeBytes à la place d'un write.getBytes pour le "OK" et un readLine ... Mais le problème est cette fois-ci que l'image transférer n'est pas correct, il doit y avoir des pertes de données ? Pourtant tout semble correct pour les textes.
Merci.