Impossible d'envoyer un fichier avec son nom par socket

cenyo - 3 août 2012 à 19:35
cs_antares7364 Messages postés 8 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 21 septembre 2012 - 29 août 2012 à 01:16
salut tout le monde j'essaie de faire une application qui permet d'envoyer des fichiers par socket, et j'ai presque réussi sauf que quand j'envoie le nom du fichier et ensuite le fichier, le fichier reçu est corrompu mais si je n'envoie pas le nom du fichier, cela suppose que je doit obligatoirement connaitre le type de fichier que j'envoie, dans ce cas ça marche. moi je veux qu'il détecte automatiquement le type de fichier et crée automatiquement un fichier de même type pour la réception. Aider moi svp.

code client qui envoi le fichier:
socketduserveur = new Socket("127.0.0.1",2009);
//f est un fichier
PrintWriter out=new PrintWriter(socketduserveur.getOutputStream());
System.out.println("Envoi du fichier "+f.toURI().toURL());
String nom=f.getName();
System.out.println(nom);
out.println(f.getName());
out.flush();



OutputStream fluxsortie = socketduserveur.getOutputStream();

long taillefichier =f.length();

System.out.println("Taille : "+ taillefichier);

long nbpassagesuposé=taillefichier / 4096;

System.out.println("Passages supposés : "+nbpassagesuposé);

InputStream in = new BufferedInputStream(new FileInputStream(f));
ByteArrayOutputStream tableaubytes = new ByteArrayOutputStream();
BufferedOutputStream tampon = new BufferedOutputStream(tableaubytes);

int lu = in.read();
int[] aecrire = new int[4096];
int compteur = 0;
long ouonestrendu=0;

//Tant qu'on est pas à la fin fu chier
while(lu > -1)
{
//On lit les données du fichier
aecrire[compteur] = lu;
lu = in.read();
compteur++;


//Quand on a rempli le tableau, on envoie un paquet de 4096 octets
if(compteur == 4096)
{
compteur=0;
ouonestrendu++;
//On remplit le tampon
for(int x=0;x<4096;x++)
tampon.write(aecrire[x]);

//Et on l'envoie
fluxsortie.write(tableaubytes.toByteArray());

tableaubytes.reset();
System.out.println("Avancement : "+(float) ouonestrendu/nbpassagesuposé * 100+"%");
}
}

//On envoie le dernier paquet, qui ne fait pas forcément 4096 octets
//On remplit le tampon
for(int x=0;x<4096;x++)
tampon.write(aecrire[x]);

//Et on l'envoie
tampon.flush();
fluxsortie.write(tableaubytes.toByteArray());
fluxsortie.flush();

System.out.println("Avancement: "+(float) ouonestrendu/nbpassagesuposé * 100+"%");

System.out.println("Youpi finished");
in.close();
tampon.close();
System.out.println("Passages effectués : "+ouonestrendu);
socketduserveur.close();
out.close();
}
else
{
System.out.println("Le fichier "+f+" est introuvable");
} } catch (UnknownHostException ex) {
Logger.getLogger(Envoi.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Envoi.class.getName()).log(Level.SEVERE, null, ex);
}
}
});

this.setContentPane(pan);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);



}


code serveur qui reçoit le fichier:

String nom="inconnu";
while (true) {
try {
socketserver = new ServerSocket(2009);
socketduserveur = socketserver.accept();
Byte[] taillefichier;
int lire;
long taille=0;
BufferedReader in=new BufferedReader(new InputStreamReader(socketduserveur.getInputStream()));
//BufferedInputStream in=new BufferedInputStream(socketduserveur.getInputStream());
nom=in.readLine();
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(nom));

lire=in.read();
int compteur=0;

while(lire>-1)
{
out.write(lire);
lire=in.read();
compteur++;
}
out.write(lire);

out.flush();
out.close();
in.close();
socketduserveur.close();
} catch (IOException ex) {
Logger.getLogger(Recevoir.class.getName()).log(Level.SEVERE, null, ex);
}
}

3 réponses

cs_antares7364 Messages postés 8 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 21 septembre 2012
29 août 2012 à 01:09
Ton code n'est pas propre. Je pense que ton souci vient du fait que tu mélanges flux de caractères et flux d'octets, le tout avec une couche de bufferisation qui n'arrange rien.
Pour transférer ton fichier binaire, un exemple de code vite fait :

// code client qui envoi le fichier :
socketduserveur = new Socket("127.0.0.1",2009);
OutputStream out = socketduserveur.getOutputStream();
out.write((f.getName()+"\n").getBytes());
InputStream in = new FileInputStream(f);
byte[] buf = 4096;
while(true) {
int len = in.read(buf);
if(len==-1) break;
out.write(buf, 0, len);
}
in.close();
out.close();

// code serveur qui reçoit le fichier :
InputStream in = socketduserveur.getInputStream();
String nomfichier = "";
while(true) {
char c = (char) in.read();
if(c=='\n') break;
else nomfichier += c;
}
OutputStream out = new FileOutputStream(nomfichier);
byte[] buf = 4096;
while(true) {
int len = in.read(buf);
if(len==-1) break;
out.write(buf, 0, len);
}
in.close();
out.close();

---
Helix Multimedia : transfert de fichier, hébergement boites e-mail.
0
cs_antares7364 Messages postés 8 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 21 septembre 2012
29 août 2012 à 01:14
Est ce que ton nom de fichier comporte des caractères non standards (hors ISO-8859-1) ?
Si oui tu risques d'avoir des soucis avec mon code qui ne lit le nom du fichier qu'octet par octet, mais tu peux le convertir en hexa, ou améliorer le code pour qu'il gère correctement le multi-octet.

---
Helix Multimedia : développement web, transfert de fichier, hébergement boites e-mail.
0
cs_antares7364 Messages postés 8 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 21 septembre 2012
29 août 2012 à 01:16
Dernier PS : tu peux aussi utiliser des classes qui gèrent le transport de données via protocole HTTP, voir :
http://stackoverflow.com/questions/1314249/upload-and-post-file-to-php-page

---
Helix Multimedia : transfert de fichier, hébergement boites e-mail.
0
Rejoignez-nous