IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[Socket] Fermeture correcte


Sujet :

Entrée/Sortie Java

  1. #1
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut [Socket] Fermeture correcte
    Bonjour,

    vous l'aurez peut-être remarqué que tous mes problèmes sont basés sur le concept des sockets, cette fois-ci je cherche le meilleur moyen de fermer son (client/serveur) après un transfert de fichiers, le mien m'affiche l'erreur : (Connection reset by peer) je pense que j'interrompe la connexion avant qu'elle ait fini, mais je ne sais pas comment résoudre ça, voici mon code :

    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
     
     OutputStream os = null;
            DataOutputStream dos = null;
            Socket sock = null;
     
            try {
                sock = new Socket("127.0.0.1", 80);
     
     
                File myFile = new File("D:\\Zest\\1.png");
                byte[] mybytearray = new byte[(int) myFile.length()];
     
                FileInputStream fis = new FileInputStream(myFile);
                BufferedInputStream bis = new BufferedInputStream(fis);
     
     
                DataInputStream dis = new DataInputStream(bis);
                dis.readFully(mybytearray, 0, mybytearray.length);
     
                os = sock.getOutputStream();
     
                     dos = new DataOutputStream(os);
                dos.writeUTF(myFile.getName());
                dos.writeLong(mybytearray.length);
                dos.write(mybytearray, 0, mybytearray.length);
                dos.flush();
     
     
                os.write(mybytearray, 0, mybytearray.length);
                os.flush();
     
                os.close();
               dos.close();  
              sock.close();  
     
            } catch (IOException ex) {
     
                Logger.getLogger(Envoyer.class.getName()).log(Level.SEVERE, null, ex);
     
                System.out.print("Erreur 1: "  + ex.getMessage());
     
            }
    Réception:
    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
     
       public class thread_envoi extends Thread {
     
            @Override
            public void run() {
     
                 try {
                int bytesRead;
                int current = 0;
     
                ServerSocket serverSocket = null;
                serverSocket = new ServerSocket(80);
     
                while(true) {
                    Socket clientSocket = null;
                    clientSocket = serverSocket.accept();
     
                    InputStream in = clientSocket.getInputStream();
     
                    DataInputStream clientData = new DataInputStream(in);
     
                    String fileName = clientData.readUTF();
                    OutputStream output = new FileOutputStream("D:\\"+fileName);
                    long size = clientData.readLong();
                    byte[] buffer = new byte[1024];
                    while (size > 0 && (bytesRead = clientData.read(buffer, 0, (int)Math.min(buffer.length, size))) != -1)
                    {
                        output.write(buffer, 0, bytesRead);
                        size -= bytesRead;
                    }
     
     
                    in.close();
                    clientData.close();
                    output.close(); 
     
                }   } catch (IOException ex) {
                Logger.getLogger(Recevoir.class.getName()).log(Level.SEVERE, null, ex);
            }
     
     
            }
     
        }
    Merci pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 852
    Points : 22 869
    Points
    22 869
    Billets dans le blog
    51
    Par défaut
    Je dirai a priori que l'ordre de tes fermetures est naze puisque tu fermes os avant de fermer dos. Mais je peux me tromper.

    Je te rappelle que si tu utilises Java 7, le try-with-resources peut t’éviter de devoir explicitement invoquer close() et que les fermetures auront lieu 1) implicitement et 2) dans l'ordre inverse de leur déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    try (Socket sock = [...];
          OutputStream os = [...];
          DataOutputStream dos = [...]) {
        [...]
     
        try (FileInputStream fis = [...];
              BufferedInputStream bis = [...]) {
     
            [...]
     
        }
     
        [...]
    }
    De plus, toujours depuis Java 7, la classe utilitaire java.nio.files.Files dispose de methodes permettant de recopier le contenu de fichiers/paths dans des flux sans se casser la tête.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    En l'occurrence, le problème est qu'il envoie deux fois son fichier alors qu'il ne le lit qu'une fois et que le lecteur ferme de son côté après première lecture.

    Mais ce problème ne serait pas arrivé avec des ouvertures et fermetures rendues claires et nettes par une bonne utilisation de try-with-resource.

  4. #4
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    Merci tous les deux pour vos explication, l'erreur venait d'un bout de code en plus, t'avais bien vu "thelvin", et toi aussi "bouye" concernant le (try-with-resources) !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Socket] Fermeture socket conduit a exception
    Par taillooo dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 21/01/2008, 17h52
  2. [.NET 2.0] Comment gérer correctement des sockets ?
    Par MattC dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/02/2006, 16h31
  3. Réponses: 2
    Dernier message: 07/01/2006, 12h33
  4. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 01h03
  5. [Linux] Probleme de fermeture de Sockets
    Par diefo dans le forum Réseau
    Réponses: 6
    Dernier message: 30/12/2003, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo