Salut,
je vous presente mon probleme : je souhaite realiser un transfert de fichiers entre 2 machines par socket. Lorsque je transfere un petit fichier (du style 50 ko) tout fonctionne bien. Mais quand j'essaie de transferer un fichier un peu plus gros (un mp3 de 3Mo par exemple), le programme transfere seulement une centaine d'octets et la classe qui sert a l'emission me sort l'erreur : java.net.SocketException: Software caused connection abort: socket write error
Je pense que ca doit merder au niveau des tampons ou quelque chose comme ca mais jai pas reussi a resoudre le probleme.
J'ai 2 classes, une gerant l'emission et une gerant la reception. Je vous copie la source ci-dessous. Si quelqu'un a une idée pour m'aider je le remercie d'avance.
Classe pour l'envoi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
public class EmissionFichier extends Emission implements Runnable {
    private DataOutputStream sortieData;
    private BufferedOutputStream sortie;
    private BufferedInputStream entreeFichier;
    private File fichier;
 
    public EmissionFichier(Donnees d, Connexion c, OutputStream o) {
        super (d,c);
        this.sortie = new BufferedOutputStream (o);
        this.sortieData = new DataOutputStream(o);
    }
 
 
    public void setFichier (File f)  {
        this.fichier = f;
        try {
            this.entreeFichier = new BufferedInputStream(new FileInputStream (f));
        } catch (FileNotFoundException e) {
            connexion.addTexte ("Fichier introuvable");
        }
    }
 
 
    public void envoi ()  {
        int octet;
        String nom = fichier.getName ();
        try {
            sortieData.writeLong(fichier.length()); // on envoie la taille du fichier
            sortieData.writeInt(nom.length()); // on envoie la longueur du nom
            sortieData.writeBytes(nom); // on envoie le nom
            while ((octet = entreeFichier.read()) != -1)  {
                sortie.write(octet);
            }
            sortie.flush();
        }
        catch (IOException g)  {
           System.out.println ("Erreur dans l'envoi du fichier : "+g);
        }
        finally {
              connexion.deconnecter();
        }
    }
 
    public void run() {
        if (fichier != null)
           envoi ();
    }
}
Classe pour la reception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
public class ReceptionFichier extends Reception {
    private DataInputStream entree;
    private FileOutputStream sortieFichier;
    private File fichier;
 
    public ReceptionFichier(Donnees d, Connexion c, InputStream i) {
        super(d, c);
        this.entree = new DataInputStream(new BufferedInputStream(i));
    }
 
 
    public void run() {
        int octet;
        long tailleRecue = 0;
        long tailleFichier = 1;
        try {
            tailleFichier = entree.readLong(); // on lit la taille du fichier
            int longueurNom = entree.readInt();
            // lecture du nom du fichier
            String nom = "";
            for (int i = 0; i < longueurNom; i++) {
                nom += (char)entree.readByte();
            }
            try {
                sortieFichier = new FileOutputStream(nom);
            } catch (FileNotFoundException e) {
                System.out.println("Erreur : " + e);
            }
            while ((octet = entree.readByte()) != -1) {
                sortieFichier.write(octet);
                tailleRecue++;
            }
        } catch (IOException e) {
            // verifier si la taille recue est bien la taille originale
            if (tailleRecue < tailleFichier)
                System.out.println("Erreur : " + e);
        } finally {
            connexion.deconnecter();
        }
    }
}