cs_omega2
Messages postés28Date d'inscriptionlundi 18 août 2003StatutMembreDernière intervention15 novembre 2004
-
29 août 2004 à 04:13
dushit
Messages postés44Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention11 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.
cs_omega2
Messages postés28Date d'inscriptionlundi 18 août 2003StatutMembreDernière intervention15 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.