Transfert fichier : bout manquant

cs_omega2 Messages postés 28 Date d'inscription lundi 18 août 2003 Statut Membre Dernière intervention 15 novembre 2004 - 29 août 2004 à 04:13
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006 - 27 févr. 2006 à 21:59
Bonjour tout le monde.
je suis entrein de me faire un mini serveur de fichier et je bloque sur le transfert d'un dit fichier.
Pour voir si j'arrivais a envoyer des fichier convenablement, je me suis fait deux script de test : un qui envoie un fichier et l'autre qui le recoit.
Tant que le client est aussi rapide (ou plus rapide) que le serveur, je n'ai aucun probléme.
Le probléme, c'est que quand le "client" est beaucoup trop lent, une partie du fichier disparait.
taille initiale du fichier de test : 191618
taille a l'arrivé : 156144

------------------------------------
partie du serveur qui envoie le fichier :
---------
long lue = 0;
try{
File fichier = new File("c:\\anime\\test.avi");
TailleFic = fichier.length();
FileInputStream input = new FileInputStream(fichier);
byte[] portion = new byte[2000];
int taillePartie;
while (lue<TailleFic){
if (!digit.isClosed()){
//Thread.sleep((long) 1000,0);
Thread.sleep((long) 10,0);
taillePartie=input.read(portion);
lue=lue+taillePartie;
this.out.write(portion,(int) 0,(int) taillePartie);
System.out.println(String.valueOf(TailleFic)+ " : "+String.valueOf(lue));
}
}
}catch (IOException e){
e.printStackTrace();
}catch (InterruptedException e2){
e2.printStackTrace();
}
System.out.println(String.valueOf(TailleFic)+ " : "+String.valueOf(lue));
---------
"digit" est de type Socket
"out" est de type BufferedOutputStream
"TailleFic" est de type long initialisé à 0
------------------------------------

------------------------------------
partie du client qui le recoit :
---------
long TailleFic=0;
try{
byte[] portion = new byte[2000];
while (!digit.isClosed()){
Thread.sleep((long) 0,10);
int taille=0;
while(taille>=0){
Thread.sleep((long) 1000,0);
TailleFic=TailleFic+taille;
taille=in.read(portion,0,2000);
System.out.println(TailleFic);
}
}
}catch (IOException e){
}catch (InterruptedException e2){
}
System.out.println(TailleFic);
---------
"digit" est de type Socket
"in" est de type BufferedInputStream
------------------------------------

Qu'est ce que je dois changer dans mon code pour éviter de perdre des données? J'ai l'impression qu'en pratique quand le client a libéré sufisament de place dans son buffeur, le serveur se met a lui envoyer le plus de données possible dans le temps le plus court possible ce qui fait que le temps que le client le prévienne qu'il peut plus rien recevoir, certains paquets de données sont perdus. Comme on peut s'en douter, c'est pas une situation idéale. ;)

PS : Me dites pas d'enlever le "Thread.sleep((long) 1000,0);" du client, c'est fait exprés pour simuler une conection trés lente et voir comment se comporte le serveur.

3 réponses

wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
30 août 2004 à 09:39
dans les catch du receveur, met quelquechose pour voir les exception. Normalement il doit y en avoit une.
0
cs_omega2 Messages postés 28 Date d'inscription lundi 18 août 2003 Statut Membre Dernière intervention 15 novembre 2004
30 août 2004 à 14:52
T'as raison, j'ai droit a une erreur :

java.net.SocketException: Connection reset

Finalement, ce qui se passe, c'est que le serveur envoie les données. Une fois qu'il a tout envoyé, il coupe la liaison. Le probléme, c'est que le client lui quand il se rend compte que la liaison est coupé, il vide le buffeur et tant pis pour ce qui restait dedans. :(

Si je met une tempo assez grande sur le serveur, ca passe.
0
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
27 févr. 2006 à 21:59
salut,
tu pourrai me dire ce que tu declare en donnees membres.
Merci beaucoup
dushit
0
Rejoignez-nous