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 :

[java.net][TCP] Rupture de connexion ? Détection ?


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut [java.net][TCP] Rupture de connexion ? Détection ?
    Jeux de données :
    - 1 serveur
    - Chaque connection du client au serveur génère un thread serviceClient

    Scenario de test :
    - Le client se connect au serveur sous une console (type unix ou dos)
    - Une fois que le serveur génère un thread pour s'en occuper, le client rompt brutalement la connexion (il ferme la console)

    Résultat obtenu :
    - Soit 1 NullPointerException, soit un SocketException.

    Ce que je voudrais faire :
    - Détecter la déconnexion du client avant même avoir généré une exception : fermer la connexion du client proprement (le retirer de mon vecteur serviceClient, mettre à jour un certain nombre de données).

    Est il possible de réaliser exactement ce que j'ai l'intention de faire, ou suis je obligé de traiter de manière exhaustive toutes les exceptions engendrées par sa déconnexion brutale ?

    d'avance Merci !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    bon comme personne n'a l'air inspiré j'ai procédé classique, j'ai traité toutes les exceptions ! (que j'ai aperçu jusqu'à présent !!)
    - si je rentre kkchose dans le canal et que je ferme la console à ce moment, c'est une SocketException (soustype IOException) qui est déclenchée !!!
    - si le canal est encore vierge de toute entrée, le readLine() renvoie NULL !!

    Problème restant :
    COMMENT DETRUIRE UN THREAD PROPREMENT ? j'obtiens une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    java.lang.NoSuchMethodError
     
    	at java.lang.Thread.destroy(Thread.java:786)
     
    	at sbn.decrCompteur(sbn.java:38)
     
    	at serviceJoueur.purgerService(serviceJoueur.java:235)
     
    	at serviceJoueur.run(serviceJoueur.java:249)
    en faisant stop, il reste dans la mémoire ? j'aimerais le purger totalement du server ? Un moyen ?

    Merci les gars !

  3. #3
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello.
    Pour détruire un thread, je sais pas. Par contre, pour l'arrêter: il faudra que ton thread aille lire régulièrement une variable, genre boolean, pour savoir s'il doit s'arrêter ou pas.
    Et à partir du Thread principal, tu changes cette variable.

    Une fois un Thread arrêté, le système finira bien par le "détruire" (gc). Mais là, on peut pas vraiment compter dessus en principe.

    À noter que le Thread.stop() est deprecated...
    Glob
    What would you do if you were not afraid?

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Si ca peut t'intéresser :

    Info api sur s.stop() stop est dépréciée..
    Because it is inherently unsafe. Stopping a thread causes it
    to unlock all the monitors that it has locked. (The monitors
    are unlocked as the ThreadDeath exception propagates up the stack.)
    If any of the objects previously protected by these monitors were in an inconsistent state,
    other threads may now view these objects in an inconsistent state.
    Such objects are said to be damaged. When threads operate on damaged objects, arbitrary behavior can result.
    http://java.sun.com/j2se/1.3/docs/guide/misc/threadPrimitiveDeprecation.html

    Sur un forum d'ingénieur j'ai trouvé un message de 2001 prétendant que le thread s'achevait à la fin de sa fonction run(). Mais c'est faux, il s'arrête juste. Le thread subsiste en mémoire même après la terminaison de sa méthode run() : il redevient actif lorsqu'on appelle une de ses méthodes depuis un autre objet.

    Pour le reste, j'aimerais vraiment savoir comment détecter qu'un client se déconnecte d'un server, connaissez vous une solution ? Détecter des exceptions c'est totalement débile, je m'en suis aperçu hier... Si le server n'attend rien du client et qu'il se déconnecte brutalement, aucune exception n'est déclenchée : le thread associé subsiste, mais le client s'est barré...

    Besoin d'être confirmé. 8)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut 1 aspect de la solution : on écrit sur le canal de sortie
    1 aspect de la solution : on écrit sur le canal de sortie périodiquement :

    au démarrage du thread client, je lance un thread observer associé à la socket 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
    public class Observer extends Thread {
      private Socket s;
      private serviceJoueur service;
      public Observer(Socket s, serviceJoueur service) {
        this.s = s;
        this.service = service;
      }
      public void run() {
        try {
          int i = 0;
          while (true) {
            // check table ascii... 0 = null
            s.sendUrgentData(0);
            // on écrit sur le toutes les secondes
            synchronized(this) {wait(1000);}
            i++;
          }
        } catch (InterruptedException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
          // on pourra tuer par la suite le service associé à la socket
        }
      }
    }

    pas de problème. si un problème se présente sur un canal de socket client, il se présentera tot ou tard ici. Donc ça marche.

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

Discussions similaires

  1. Tester une connexion java.net.URL
    Par KRis dans le forum Langage
    Réponses: 4
    Dernier message: 14/09/2010, 09h40
  2. Réponses: 1
    Dernier message: 26/07/2010, 16h38
  3. Réponses: 1
    Dernier message: 13/07/2010, 16h10
  4. Réponses: 2
    Dernier message: 18/07/2007, 19h26
  5. rupture de connexion en java
    Par mmorad dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 13/03/2007, 15h18

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