la valeur de lu ne passe jamais à -1...
elle ne voit pas la fin du fichier.. donc je ne peux pas l'arrêter.
pour ça, j'ai trouvé une solution, je créé un message avec la taille du fichier a envoyer :
Code :
- long taille =listeVideos.get(y).getFichierVideo().length();
|
puis je l'envoie via un message socket et j'ajoute ceci :
Code :
- while(lu > -1){
- lu = inBuffer.read();
- outBuffer.write(lu);
- compteur++;
- if (compteur == taille){
- lu = -1;
- }
- }
|
grâce à ça, je peux arrêter la lecture du buffer et fermer mes flux.
mais je suis toujours pas sorti d'affaire, parce que je dois envoyer plusieurs fichiers a la suite,
j'avais donc fais une procédure de ce genre :
- le serveur compte le nombre de fichier a envoyer et l'envoie au client
- le serveur fait une boucle de 0 a nombre de fichiers
- envoie le nom et la taille du fichier
- envoie le fichier
le client :
- le client reçoit le nombre de fichier
- le client fait une boucle de 0 a nombre de fichiers
- reçoit le nom et la taille du fichier
- reçoit le fichier
cette procedure me semble correcte, elle marche bien pour le premier fichier, mais ca plante des le 2eme... avec un message connection reset..
c'est pour ca que je ne fermait pas le flux outputstream coté serveur, car je veux envoyer plusieurs fichiers..
Voici le code de la procedure ci dessus :
Code :
- int nbVideos = listeVideos.size(); /* nombre de videos a envoyer */
- reponseRequete = Proprietes.ACK + Proprietes.SEPARATOR + nbVideos;
- int ret = envoiMessage(reponseRequete); /* envoi le message contenant le nombre de video */
- if (ret == Proprietes.ACK){ /* l'envoi s'est bien passé */
- for (int y=0 ; y<nbVideos ; y++){ /* on liste toutes les videos à rapatrier */
- String nomVideo = listeVideos.get(y).getFichierVideo().getName(); /* recuperation du nom de fichier */
- long taillefichier =listeVideos.get(y).getFichierVideo().length();
- String chemin = listeVideos.get(y).getFichierVideo().getAbsolutePath();
- reponseRequete = Proprietes.ACK + Proprietes.SEPARATOR + nomVideo+ Proprietes.SEPARATOR + taillefichier; /* on envoie nom et taille de la video */
- retour = envoiMessage(reponseRequete); /* on envoie le message de la video au client */
- if (retour == Proprietes.ACK){ /* le client a bien recu le nom et la taille */
- try {
- retour = sendFile(chemin); /* la fonction d'envoi deja postée */
- } catch (IOException e) {
- e.printStackTrace();
- }
- }else{
- return Proprietes.ERR_UNKNOWN;
- }
- }
- }
|
coté client :
Code :
- requete = recevoirMessage(); /* on recoit le nombre de videos */
- String[] stringSplit = requete.split(SEPARATOR); /* on split le nom de la video courante */
- String codeRetourStr = stringSplit[0];
- int codeRetour = Integer.valueOf(codeRetourStr);
- if (codeRetour ==ACK){ /* il n'y a pas eu d'erreur detectee */
- String nbVideoStr = stringSplit[1]; /* on recupere le nombre de videos sous forme de chaine */
- int nbVideo = Integer.valueOf(nbVideoStr); /* on le converti en entier */
- for(int y = 0 ; y<nbVideo ; y++){ /* on boucle pour recuperer toutes les videos */
- requete = recevoirMessage(); /* recuperation de la requete du client */
- stringSplit = requete.split(SEPARATOR); /* on split la requete */
- codeRetourStr = stringSplit[0];
- codeRetour = Integer.valueOf(codeRetourStr);
- String nomVideo = stringSplit[1]; /* on recupere le nom de la video sous forme de chaine */
- int nbEtapes = Integer.valueOf(stringSplit[2]);
- try {
- ret = recuperationVideos(nomVideo, nbEtapes); /* on lance la recuperation de la video, fonction deja postée tout au dessus */
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
|
l'erreur que j'obtiens
coté serveur :
java.net.SocketException: Broken pipe
coté client :
java.net.SocketException: Socket closed
si je vire les appels de fonctions qui envoient/recoivent les fichiers, tous les echanges fonctionnent, je dois donc fermer qqch qui bloque la connexion, puisque la ligne qui pose probleme, c'est celle contenant le writeObject(message); ou le readObject();
voila, j'espere avoir été clair.
merci pour votre aide !
Message édité par dumoulex le 04-05-2011 à 13:49:22