Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008
-
2 nov. 2007 à 09:10
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 2010
-
5 nov. 2007 à 00:55
Bonjour,
je suis actuellement en train d'essayer de développer une application qui envoit un fichier d'un pc à un autre en réseau local. J'initie le transfert avec une séquence de ce type :
J'ai une constante splitLength définie sur 2048 qui définit la taille des morceaux. Donc nombremorceau désigne en combien de morceaux le fichier va être découpé et rest désigne le nombre d'octets restants après les nombremorceau morceaux.
Le progamme le recoit donc bien, ensuite voici l'algorithme d'envoi :
Apparemment l'envoi se passe bien car quand j'affiche ce qui a été envoyé, tout est bien affiché, le problème est qu'à la réception, il ne récupère pas les 4 derniers octets. Donc si je met une suite de
Jean-claude
Jean-claude
Jean-claude
Ca arrivera en
Jean-claude
Jean-claude
Jean-cl
Mais étonamment, le fichier fait la meme taille o_O Voici le code à la réception :
char[] str = new char[splitLength];
char[] strRest = new char[rest];
try {
PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("/home/zick/Desktop/" + path)));
Un autre truc bizarre, quand le fichier contient des caractères accentués, là, c'est vraiment la cata mais je reviendrai avec ca quand j'aurais réglé ce problème la déjà... Avec votre aide je pense bien :p
indiana_jules
Messages postés750Date d'inscriptionmardi 9 mars 2004StatutMembreDernière intervention23 décembre 200822 2 nov. 2007 à 15:01
Salut
pour les caractéres, c'est normal, il faut que tu précises à ton flux de réception quel type de codage il s'agit (UTF-8 ...)
pour le reste, je pense que dans ta boucle, il faudrait mieux faire un x++ qu'un ++x
z bozzo
Messages postés34Date d'inscriptionlundi 19 mars 2007StatutMembreDernière intervention15 novembre 2007 2 nov. 2007 à 17:53
Salut,
Pour avoir passé du temps sur les problemes d'encoding, je te conseille de bien verifier l'encoding d'envoi et celui d'arrivé. Ce n'ai pas obligé qu'ils soient en UTF-8, tu peu les avoir en iso-8859-1, ASCII, ... il faut juste qu'ils soient identiques c'est a dire si ton fichier est en UTF-8 tu doit le receptionner en UTF-8 par exemple.
Pour tes 4octets: deja de faire ++x (pre incrementation) te fait demarer un rang plus loin (pas de x = 0). tu peut essayer de tester la fin de fichier:
while ( nbOctetsLus > -1 )
{
...
// InputStreamReader.read() renvoi le nombre d'octet lus ou -1 si fin de fichier
// equivalent au EOF en C.
nbOctetsLus = in.read(str, 0, splitLength);
...
}
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008 2 nov. 2007 à 19:02
Re bonjour,
alors, niveau du charset j'ai bien vérifié, j'ai mis UTF-8 partout. J'ai quand meme essayé avec le x++ à la palce du ++x mais ca ne change rien... C'est logique, ca ne fait pas démarrer un rang plus loin vu que ca s'exécute après les instructions, ++x est juste plus performant que x++.
Pour le test de la fin du fichier, je ne l'ai pas fait, mais je suis sur qu'il arrive à la fin car j'ai affiché strRest et là le Jean-claude de la fin est complet...
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 201017 5 nov. 2007 à 00:55
ya plein de code qui te permlettent de le faire sur le site
"pour le reste, je pense que dans ta boucle, il faudrait mieux faire un x++ qu'un ++x" = > non il a raison ++x est plus optimise
essai de voir si tu split pas un caractere de plus que ce que tu devrais ou si tu cree pas un decallage sinon je suis d'ac avec z_bozzo et tester la fin du fichier pour l'envois
j'ai deux morceaux de code ici
:
public
File
receivedFile (String
name)
{
<gras>this.stopManagerRead();
File
dest
=
new File(name);
try {
FileOutputStream
fout
=
new
FileOutputStream(dest);
InputStream
in
=
activeConnection.getInputStream();
byte[]
buff
=
new
byte[512];
int r
=
in.read(buff);
while (r
>
-1)
{
fout.write(buff,
0,
r);
if (r
<
512)
break;
r
=
in.read(buff);
}
fout.close();
}
catch
(FileNotFoundException
e)
{
e.printStackTrace();
}
catch (IOException
e)
{
e.printStackTrace();
}
return dest;
}/*******************/
public synchronized boolean sendFile (File
file)
{
<gras>try {
FileInputStream
in
=
new FileInputStream(file);
byte[]
buff
=
new
byte[512];
int read
=
in.read(buff);
// BufferedOutputStream bout = new BufferedOutputStream(out);
while
(read
>
0)
{
outstream.write(buff,
0,
read);
read
=
in.read(buff);
}
return true;
}
catch (FileNotFoundException
e)
{
e.printStackTrace();
}
catch (IOException
e)
{
e.printStackTrace();
}
return false;
}
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"