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 :

Résoudre SocketException: Connection reset


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 16
    Points
    16
    Par défaut Résoudre SocketException: Connection reset
    Bonjour à tous,

    Mon mini projet consiste à envoyer des fichiers depuis mon appareil Android vers mon pc (et vis versa mais pour l'instant c'est que dans un sens).

    J'ai donc fait un programme serveur en java qui tourne en boucle sur mon pc sur Eclipse dont voici le code:

    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
    50
    51
    52
    53
    54
    55
    56
    public class FileReader {
     
        private static ServerSocket serverSocket;
        private static Socket clientSocket;
        private static BufferedInputStream bis;
        private static DataInputStream dis;
     
     
            public static void main(String[] args) {
            String dirPath = "C:\\docPda\\prelevement\\";
            try {
                serverSocket = new ServerSocket(7800);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                while (true) {
                    try {
     
                        clientSocket = serverSocket.accept();
     
     
                        bis = new BufferedInputStream(clientSocket.getInputStream());
                        dis = new DataInputStream(bis);
                        int filesCount = dis.readInt();
                            File[] files = new File[filesCount];
     
                            for (int i = 0; i < filesCount; i++) {
                                long fileLength = dis.readLong();
                                String fileName = dis.readUTF();
     
                                files[i] = new File(dirPath + "/" + fileName);
     
                                FileOutputStream fos = new FileOutputStream(files[i]);
                                BufferedOutputStream bos = new BufferedOutputStream(fos);
     
                                for (int j = 0; j < fileLength; j++)
                                    bos.write(bis.read());
     
                                bos.close();
                            }
                                clientSocket.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } finally {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    et voici le code coté client (Android):

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    public class FileSender extends AsyncTask<String, Integer, String> {
     
        private String ip;
        private int port;
        private Boolean bool;
     
        public FileSender(String ip, int port, Boolean bool){
            this.ip = ip;
            this.port = port;
            this.bool = bool;
        }
     
        @Override
        protected String doInBackground(String... serverAdd) {
            String directory;
            if (this.bool) {
                 directory = Environment.getExternalStorageDirectory() + "/" + "traca";
            }
            else {
                directory = Environment.getExternalStorageDirectory() + "/" + "GetSignature";
     
            }
                Socket socket;
     
                File[] files = new File(directory).listFiles();
                if (files.length > 0) {
                    try {
                        socket = new Socket(ip, port);
     
                        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
                        DataOutputStream dos = new DataOutputStream(bos);
     
                        dos.writeInt(files.length);
     
                        for (File file : files) {
                            long length = file.length();
                            dos.writeLong(length);
     
                            String name = file.getName();
                            dos.writeUTF(name);
     
                            FileInputStream fis = new FileInputStream(file);
                            BufferedInputStream bis = new BufferedInputStream(fis);
     
                            int theByte = 0;
                            while ((theByte = bis.read()) != -1) bos.write(theByte);
     
                            bis.close();
     
                            file.delete();
                        }
                        socket.close();
                        dos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            return null;
        }
    }
    et enfin l'expression que j’exécute à l'appui du bouton sur mon appareil:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (isConnected(MainActivity.this)) {
     
        FileSender s = new FileSender(prefs.getString("ip_adress", null),
                Integer.valueOf(prefs.getString("port_dest", null)),
                true);
        s.execute();
    }
    code de la fonction isConnected():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Boolean isConnected(Context context){
        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
     
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnectedOrConnecting();
        return isConnected;
    }
    Petite information supplémentaire : mon appareil Android n'est pas un téléphone mais un terminal de collecte de données que je dépose dans une borne pour le connecter au réseau ethernet.

    Le programme fonctionne correctement mais j'ai remarqué une faille lorsque je dépose mon appareil dans la borne (donc mon appareil est connecté, de toute façon je check la connexion avant de faire quoi que ce soit avec ma fonction isConnected) et que j'appui rapidement sur le bouton d'envoi, cette exception s'affiche sur éclipse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at java.io.BufferedInputStream.fill(Unknown Source)
        at java.io.BufferedInputStream.read(Unknown Source)
        at java.io.DataInputStream.readInt(Unknown Source)
        at FileReader.main(FileReader.java:26)
    par contre si j'attend environ 5 secondes environ après avoir déposer mon appareil et que je déclenche là je n'ai aucun problème.

    En espérant avoir été clair.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    il est très étrange que cela marche dans certains cas.

    Mais rappelle-toi qu'il faut fermer le DataOutputStream avant de fermer la Socket.
    En fait, ce serait une bonne idée d'utiliser le try-with-resource, ce qui fermerait automatiquement les ressources au moment où tu as fini de t'en servir, et le ferait dans le bon ordre.

    Commence déjà par corriger ça, car c'est indispensable. ... Mais c'est vrai qu'en principe, avec ce code ça ne devrait presque jamais marcher, alors c'est étrange que ça marche parfois. Tiens-nous au courant après avoir corrigé le code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    salut merci pour ta réponse, maintenant ça marche un peu mieux: mon serveur continue de boucler après la socketException et c'est ce que je voulais.
    Le problème c'est que si je n'attend pas ces fameuses 5 secondes (nécessaires pour la connexions s'établisse correctement ??), ça déclenche l'exception mais bon c'est pas grave le problème vient surement de l'appareil android, le truc bizarre c'est que ma fonction isConnected renvoie true (donc détecte une connexion) bien avant ces 5 secondes.
    Enfin bref merci beaucoup pour ta réponse, je pense qu'on peut considérer le topic comme résolu.

Discussions similaires

  1. résoudre erreur SocketException: Connection reset
    Par s9aye dans le forum Android
    Réponses: 0
    Dernier message: 18/05/2018, 16h28
  2. Réponses: 5
    Dernier message: 10/01/2009, 13h44
  3. java.net.SocketException: Connection reset
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 08/10/2008, 10h24
  4. Réponses: 6
    Dernier message: 04/07/2008, 17h58
  5. Exception java.net.SocketException connection reset
    Par cigala5555 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 22/05/2008, 22h33

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