Pb pour envoyer un fichier....

egire Messages postés 9 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 21 mars 2006 - 20 mars 2006 à 20:28
egire Messages postés 9 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 21 mars 2006 - 21 mars 2006 à 00:42
bonjour, j'ai un petit problème en java pour envoyer un fichier, je vais vous éxpliquer :

Le but est de faire un serveur et un client, le client demande l'envoi
de fichier en envoyant une chaine de caractère avec '/' devant, cette
chaine de caractère correspond au nom de fichier à envoyer...

voici le code correspond qui est situé dans un thread :



1) else if(message.startsWith("/"))

2) {

3)

Socket s3 = _s2; //_s2 est le socket ou il
faut envoyer le fichier

4) OutputStream op = s3. getOutputStream() ;

5) File f = new File(ics.CheminPartageFich(), message); // cré un file du fichier à envoyer


// pour ouvrir le fichier ds un
buffer

6) BufferedInputStream _in_ = new BufferedInputStream(new FileInputStream( f));

7) _out_ = new BufferedOutputStream(op); // buffer de sorti pour envoyer le fichier

8)

String taille = ""; // pour receptionner la
taille

9) int taille1 = (int)f. length() ; // pour la taille du fichier a envoyer

10) taille = String.valueOf(taille1); // pour la taille

11) sendCli("&"+taille); // on envoi la taille au client

12) byte[] buffer = new byte[ 4096]; // nouveau tableau de byte pour recevoir le fichier

13) int nb =0;

14) _out_.write((int)taille1);

15) while ((nb _in_. read( buffer<gras>)) !</gras> -1)

16) {

17) _out_.write(buffer, 0, nb); // on envoi ce qu'il y'a ds le buffer....

18)

}


19) _in_.close();

20) _out_.flush();

21)

_out_.close(); // on ferme ....


22) }



-----------------------------------------------------------------



J'éxplique le pb :

quand le client demande d'envoyer un fichier sa marche nikel, par
contre pour le deuxième fichier, le serveur refuse de l'envoyer il
bloque à la ligne 4) et j'avou que g pas compris pourquoi....

Je sais juste que c le fait de faire un close a la fin qui ferme tout
ce qui est ouvert au-dessus du buffer (ou en-dessous sa dépend comment
on voit les choses ... ) mais pourtant dans ma boucle je recré tous le
nécessaire, il me semble que tout ce qui est fermé de par le close est
réouvert en repassant dans la boucle ....



Si vous avez une suggestion c'est a vous.....



Merci

5 réponses

tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
20 mars 2006 à 21:15
Essaye de virer :
_out_.close();

car _out est le stream de ta SOCKET : meme si _out est un BufferedOutputStream, celui çi est le stream de la socket donc quand tu le ferme, tu ferme la connexion vers le client (dans le sens SERVEUR->Client) !! donc tu ne peux plus envoyer donc ça plante au deuxieme envoi (il n'y a plus de stream en sortie)!!! Pour reouvrir le stream, il faut refaire une connexion (TCP) avec le client. Je te conseille donc de ne jamais fermer le stream en sortie, le fermer uniquement a la fin de l'application

Rappel rapide sur TCP/IP :
-Mode connecté
-2 flux : en sortie (pour envoyer) et en entrée (pour recevoir). On peut trés bien "fermer" un sens, le sens sera fermé pour tout le temps restant (enfin je crois!)
-la socket est détruite lorsque les 2 sens sont fermés ou quand un timeout se produit
-si la socket n'est pas fermée par l'application, la socket n'est pas supprimée !! elle est supprimée par le systeme au bout d'un certain temps
0
egire Messages postés 9 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 21 mars 2006
20 mars 2006 à 21:44
J'ai deja éssayé d'enlever le close mais sa ne marche pas non plus, sa finalise pas l'envoi du fichier ....

En gros le client est toujours en attente du fichier ....

Et en fait g ajouté cette ligne la "Socket s3 = _s2; " en pensant que
sa allait fermé s3 mais pas _s2 ... Mais sa ne amrche pas ...

je savai que c'étai le socket qui se fermait ... si tu as une autre idée ...
0
tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
20 mars 2006 à 22:24
Qu'est ce que tu entends par "ne finalise pas l'envoi" ?
Tu fait du TCP ?
Essaye de mettre des _out.flush dans ta boucle while apres chaque write
Ton client se reconnecte pour le 2eme envoi?
0
egire Messages postés 9 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 21 mars 2006
20 mars 2006 à 23:19
en gros si je mets pas le close et que je vais ouvrir le fichier que je
vien de télécharger, sa me met une erreure comme koi le fichier est
endommagé ou pas valide ....

G test de mettre des flush ds la boucle mais sa ne marche pas ... Je sai plus trop ce que je peux éssayer ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
egire Messages postés 9 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 21 mars 2006
21 mars 2006 à 00:42
Bon bah dsl pour le dérangement je viens de trouver le problème,
en gros le close final faut pas le mettre ça c clair, et ensuite c'est
du cote client qu'il fallait faire correctement al boucle de reception
du fichier ;)

Très prochainement d'ici deux semaines grand max, mon projet sera dispo sur le site !



merci a bientot
0
Rejoignez-nous