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] server closed exception, readLine()


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut [Socket] server closed exception, readLine()
    Bonjour,

    je dois realiser un client qui est capable d'envoyer des messages sous forme de commandes pour le moment et plus tard recuperer des fichiers ou meme un flux video... mais ce n est pas pour tout de suite...

    Si on en reste au cas de simples commandes, j'ai fait en sorte que mon client soit a l ecoute du serveur en permanence en creant un thread supplementaire qui contient une boucle infinie et dans laquelle je fais un
    inputStream.readLine() etc..
    Le main thread se charge de declarer divers methodes et l interface graphique. Entre autres, j ai une methode disconnect() qui ferment les flux de donnees entrants et sortants ainsi que le socket lorsque l utilisateur click sur le bouton "disconnect" de l interface graphique

    Bien sur, en appuyant sur "disconnect", les flux sont fermes ainsi que le socket mais a ce moment, le thread tourne toujours et je pense que du au readLine(), cela declenche une exception qui me renvoit le message suivant:

    java.net.SocketException: socket closed
    dans ma boucle, j ai mis une condition sur socket.isConnect() ou meme le fameux readLine() != null pour sortir de la boucle si jamais la connection au serveur a ete coupe mais initie par le client. Or quoique je fasse, j ai toujours cette exception et si je teste les variables, elles ne sont pas mis a jour directement donc socket.isConnect() est toujours a true meme quand je viens de fermer le socket. J ai essaye de reduire les timeout, creer une variable secondaire et utiliser des methodes qui synchronisent les changements sur la variable ou meme de faire dormir le thread le temps qu il prenne en compte la fermeture du socket mais rien a faire. Je dois donc faire une erreur et voici, je crois, les parties du codes qui pourront vous aider:

    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
     /* Method which closes socket, streams and disable components that can only be used while connected */
        public void disconnect(int cases) {
            try {
                    if(cases == 0) clientOutput.println("Closing connection");                                         // Client initiates the disconnection.
                    if(cases == 1) clientOutput.println("Server closed the connection");                               // Server initiates the disconnection, once detected, start disconnect procedure.           
                    set(false);
                    clientOutput.close();
                    clientInput.close();
                    socket.close();
                    GraphicalUserInterface.setEnabledComponents(socket.isClosed()==true);
                    GraphicalUserInterface.addNewInformationToCommandWindow("Disconnected from " + serverName + ".");
            }
            catch(IOException e) {
    		System.out.println("Error closing socket.");
    		System.exit(1);
            }
        }
    et le code du thread:

    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
    /* Subclass that redefines Reader class to create a thread that will always be able to listen to the server while connected */
        public class IReader extends Thread {
                XilinxClient client;
                public int test = 0;
                public IReader(XilinxClient c) {
                    //super("Client Reader");
                    this.client = c;
                }
     
                public void run() {
                    clientInput = null;
                    String messageFromServer="";
                    try {
                        //Link the socket input stream to the buffered reader clienInput to be able to display the message sent by the server.
                        clientInput=new BufferedReader(new InputStreamReader(client.socket.getInputStream()));
                        while(true) {
                            if (messageFromServer == "Closing connection") {  //If server instanciates the disconnection, initate disconnection procedure
                                client.disconnect(DISCONNECTION_SERVER);
                                break;
                            }
                            else {
                                System.out.println(clientInput.readLine());
                                if(client.socket.isConnected()) {
                                //Otherwise, copy the message that has been extracted from the InputStream. 
                                messageFromServer = clientInput.readLine();
                                client.GraphicalUserInterface.addNewInformationToCommandWindow("Server said: " + messageFromServer);}
                        }
                       }
                   }
                   catch (IOException e) { System.out.println("Reader: " + e); }
                   finally { try {if (clientInput != null) clientInput.close();} catch (IOException e) {;} }
                   System.exit(0);
               }
        }
    Merci pour votre aide et bonne journee!

  2. #2
    Membre régulier Avatar de cybercrisp
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 104
    Points : 96
    Points
    96
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    messageFromServer == "Closing connection"
    messageFromServer.equals(""Closing connection"")?
    Inutile mais indispensable....

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    En fait, je crois que l erreur vient de mauvaise connaissance des serveurs/clients. Ceci est mon premier essai et donc... je n ai pas l habitude.

    Je pensais que soit l un des deux fermait la connexion avant l autre (ie socket). Donc j avais fait un cas ou c etait le serveur qui fermait la connexion et si le client recevait le message closing connection, il fermait alors ses propres sockets (mais apres ceux du serveur), sinon lorsque l utilisateur appuie sur le bouton disconnect, le client ferme ses sockets et c est la ou j avais mon erreur/exception, il ferme ses sockets mais le thread n est pas encore sorti de la boucle infinie et au prochain readLine(), il detecte que le socket est ferme et que donc il ne peut pas lire une quelconque ligne.

    Maintenant, j ai reussi a le faire marcher mais je ne sais toujours pas si c est la bonne methode. Lorsque le client se deconnecte du serveur, il envoit une commande QUIT au serveur qui ferme ses sockets avant du coup a la prochaine readLine(), il envoit null et je sors de ma boucle car j ai change ma condition sur messageFromServer = input.readLine() != null.

    Voila, j espere que ca aura pu eclairer mon probleme, merci pour votre aide

  4. #4
    Membre régulier Avatar de cybercrisp
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 104
    Points : 96
    Points
    96
    Par défaut
    Niveau serveur tcp:
    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
     
    import java.net.*;
    import java.io.*;
    public class ServeurThread extends Thread {
    final static int port = 6666;
    private Socket socket;
    public static void main(String[] args) {
    try {
    ServerSocket socketServeur = new ServerSocket(port);
    System.out.println("Lancement du serveur ...");
    while (true) { //boucle infinie, attente de connexions
    Socket socketClient = socketServeur.accept();
    ServeurThread t = new ServeurThread(socketClient);
    t.start();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    public ServeurThread(Socket socket) {
    this.socket = socket;
    }
    public void run() { //executer lorsque start() est appelée
    actions();
    }
    public void actions() {
    try {
    String message = "";
    System.out.println("Connexion avec le client : " + socket.getInetAddress());
    //entrée
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    //sortie
    PrintStream out = new PrintStream(socket.getOutputStream());
    //recoit le message in
    message = in.readLine();
     
    if (message.equals("FIN")){
    out.println("fin ...");
    out.close();    
    in.close();   
    socketClient.close();} //on ferme la socket
    else{
    //renvoie le message out
    out.println("Bonjour " + message);
    }
     
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    Au niveau du client:

    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
     
    import java.net.*;
    import java.io.*;
    public class Client {
    final static int port = 6666;
     
    public static void main(String[] args) {
    Socket socket;
    DataInputStream userInput;
    PrintStream theOutputStream;
     
    try {
    InetAddress serveur = InetAddress.getByName(args[0]);
    socket = new Socket(serveur, port);
     
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintStream out = new PrintStream(socket.getOutputStream());
     
    out.println(args[1]);
    //si args[1]=FIN, fermeture!
     
    //reception des messages du serveur in
    System.out.println(in.readLine());
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    Bon ca va t'aider ca je pense, c'est pas super propre mais j'ai fait au plus vite
    Inutile mais indispensable....

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup pour l'aide, je n'avais pas vu la reponse car j avais pu le resoudre.

    Desole pour le retard

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

Discussions similaires

  1. Détecter Socket server side closed
    Par m3allem001 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 04/12/2014, 13h32
  2. [C/C++]Socket Server/Client
    Par X-K4l1 dans le forum Développement
    Réponses: 5
    Dernier message: 03/12/2013, 12h08
  3. FTP : fréquents "Server closed connection"
    Par gifffftane dans le forum Free
    Réponses: 2
    Dernier message: 30/03/2007, 23h19
  4. Réponses: 3
    Dernier message: 27/07/2006, 17h01
  5. [Socket]Lever des exceptions
    Par Sylario dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 13h45

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