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

Langage Java Discussion :

Capturer l'exception au crash d'un serveur


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Capturer l'exception au crash d'un serveur
    Bonsoir à tous, je suis actuellement en train de travailler sur un petit projet de chat en JAVA et je bloque sur une exception.

    Pour les api, j'établis la connexion entre mes clients et mon serveur via des Sockets et des InetAddress. Ces mêmes clients sont gérés côtés serveur avec des threads. Les envois de données se font avec desDataOutputStream et des DataInputStream.

    Mon client possède un thread, permettant d'écouter en boucle l'arrivée d'un message.

    Hors la dernière exception qu'il me reste à gérer est la suivante : à la fermeture du serveur, je voudrais avertir les clients et les forcer à quitter le programme.

    Hors au crash volontaire du serveur, j'ai l'exception suivante :

    ClientServeur.Message receptionMessage
    SEVERE: null
    java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:189)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.net.SocketInputStream.read(SocketInputStream.java:203)
    at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:337)
    at java.io.DataInputStream.readUTF(DataInputStream.java:589)
    at java.io.DataInputStream.readUTF(DataInputStream.java:564)
    at ClientServeur.Message.receptionMessage(Message.java:55)
    at ClientServeur.Client.run(Client.java:223)
    at java.lang.Thread.run(Thread.java:722)
    Cette exception se répète en boucle : la boucle de mon thread :

    Classe Client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      while (connect) //la boucle en question
            {
                String recu = this.getMessage().receptionMessage(); //la ligne 223
              ...
    }
    Classe Message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       public String receptionMessage()  {
            String res = "initialisation";
            try {
                res = entree.readUTF(); //la ligne 55
            } catch (IOException ex) {
                Logger.getLogger(TraitementClient.class.getName()).log(Level.SEVERE, null, ex);
            }
            return res;

    Je n'arrive pas à attraper correctement cette exception, ni à la traiter.
    J'ai par exemple essayé de fermer Data et le Socket dans le catch de récéptionMessage(), ou de faire un throws avec une exception personnalisé (popUp + System.Exit(0) ) mais rien n'y fait.

    Je suis persuadé que ce n'est rien, mais je débute et je m'embrouille énormément avec les exceptions..


    Je vous remercie par avance de votre lecture et de vos éventuelles réponses!

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Pour commencer, ce serait bien de faire la différence entre un "crash volontaire," c'est à dire un arrêt normal, du serveur, ou bien un vrai crash, genre le serveur vient de prendre feu et ses programmes ne répondent donc plus.

    Autrement dit avant de s'arrêter le serveur devrait envoyer un genre de message "bon ben moi je m'arrête, adieu tout le monde, la socket va maintenant se fermer et ne sera plus lisible."
    Et à réception de se message, il faudra donc comprendre que la socket n'est plus utilisable, qu'il faut la fermer et s'arrêter là.
    Pour faire la différence avec quelqu'un qui ferait le même message sur le chat, tu pourrais précéder les échanges d'un "code" du serveur qui indique si c'est un message normal ou un message d'arrêt.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je te remercie de ta réponse. Le crash volontaire signifie un arrêt système, pas détectable par le programme... un vrai crash donc.

    L'arrêt volontaire est détecté par l'envoi d'une commande et une confirmation de la part de tout les clients. C'était ça en fait le souci, c'est qu'au crash du serveur, ses Sockets et ses Data sont automatiquement fermés, donc pas moyen d'en avertir le client...

    J'ai résolu le problème côté client lors de l'exception sur l'écoute en boucle d'un message qui n'arrive pas (car la connexion est coupée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            try {
                res = entree.readUTF();
            } catch (IOException ex) {
                this.getSocket().close();
                this.getEntree().close();
                this.getSortie().close();
                JOptionPane.showMessageDialog(this.getControleur().getFenetre(), "Crash du serveur - Merci de vous reconnecter ultérieurement" );
                System.exit(0);
            }

    Un peu brutal... Mais bon, une exception reste exceptionnel

    Merci encore!!

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

Discussions similaires

  1. c# - Capturer les exceptions au connection a un serveur Active Directory
    Par aiglelibre dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 07/12/2010, 17h37
  2. API ANT: capturer les exceptions
    Par pilate dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 23/12/2009, 11h43
  3. Crash d'un serveur 2008 sur Virtual serveur 2005
    Par virgul dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 03/12/2009, 22h12
  4. [Forms 6i] Capturer une exception FRM-XX
    Par macben dans le forum Forms
    Réponses: 1
    Dernier message: 05/02/2009, 15h33
  5. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52

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