egire
Messages postés9Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention21 mars 2006
-
20 mars 2006 à 20:28
egire
Messages postés9Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention21 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....
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 ....
tucobouch
Messages postés194Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 1 mai 200950 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
tucobouch
Messages postés194Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 1 mai 200950 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?
egire
Messages postés9Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention21 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 ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
egire
Messages postés9Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention21 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 !