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 :

Comment débloquer un accept ?


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Par défaut Comment débloquer un accept ?
    Bonjour à tous,

    Je crée un petit serveur java et lorsque je l'arrete, il me lance l'exception socket closed au niveau de l'accept
    ... forcément puisque j'ai fermé la socket avant de quitter le serveur.

    Celà n'a pas d'incidence sur le prog car je le ferme. Je me demande simplement si c'est une façon correcte de procéder ou serait-il plus propre de " débloquer " l'accept et si oui comment le faire ?

    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
    public class ThreadClient implements Runnable {
     
        Thread th;
        boolean enMarche;
        Socket       cSocket = null;
        ServerSocket sSocket = null;
     
        /** Creates a new instance of ThreadClient */
        public ThreadClient() 
        {
            try
            {
              sSocket = new ServerSocket(24061);
            }
            catch( Exception exc ) { System.out.println("Erreur Socket Serveur: "+exc.getMessage());}
            th = new Thread( this );
            th.start();
        }
     
        public void run()
        {
           enMarche = true;
           while( enMarche )
           {
               try
               {
                 cSocket = sSocket.accept();
               }
               catch( Exception exc ) { System.out.println("Erreur Socket Serveur: "+exc.getMessage());}
           }
        }
     
        public void interrupt()
        {
            enMarche = false;
            try
            {
              sSocket.close();
            }
            catch( Exception exc ){System.out.println("Erreur de fermeture socket: "+exc.getMessage());}
        }

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Par défaut
    Peut-être que l'utilisation d'un time out sur ton accept, dans ce cas dès qu'il arrive au bout du temps d'attente il lance une exception, tu ne fais aucun traitement mais reprend ta boucle, et comme tu as changé le booléen, la boucle s'arrête. Je sais pas si c'est super propre mais j'attends avec impatience une meilleur réponse

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Perso, je voilà ce que je fais (à tord peut-être) :
    utiliser un flag (enMarche) pour savoir si l'exception est normale ou pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try{
       cSocket = sSocket.accept();
    }catch( Exception exc ){
       if(this.enMarche){
          System.out.println("Erreur pas normale sur le accept");
          exc.printStackTrace();
       }else{
          System.out.println("Le accept est cassé suite à un arrêt volontaire du serveur");
       }
    }

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je précise juste les propos de Napalm51. Il y a la méthode setSoTimeout(int millisec) qui permet de spécifier un timeout.

    Une exception InterruptedIOException est lancée sur le timeout si le temps est passé.

  5. #5
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Petite de demande de précision au passage :
    le setSoTimeout permet de définir ?
    - la durée d'attente maximale pour qu'une connexion soit effectuée (Le temps maximal avant qu'un client ne se connecte)
    - ou bien le temps maximum entre la demande de connexion d'un client et sa connexion effective et valide ?
    C'est la bonne réponse est la première, ma solution évoquée plus haut doit tenir la route, sinon c'est que je me plante

    [Après recherche] (je poste direct pour que les gens comprennent mon raisonnement) :
    Je reprends la javadoc :
    With this option set to a non-zero timeout, a call to accept() for this ServerSocket will block for only this amount of time.
    Pour moi, ça correspond à la deuxième solution, donc millie et napalm51, vous devez avoir raison

    [EDIT]
    finallement, j'ai vraiment un doute : " call to accept()" cela sous-entend l'appel de la méthode accept() dans le source du server, ou bien l'appel du client à accept() ?

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Non, on fait setSoTimeout une fois. On pars prendre un café, on fait seulement accept et c'est à ce moment qu'on attend le timeout. On peut refaire un accept après, la gestion du timeout est toujours présent.

    Les gestions de timeout sur les sockets/serversocket se déroulent en général que sur les méthodes qui font des entrées sorties (accept, read, write) (et c'est comme si le "compteur" se réinitialisait à chaque appel système)

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

Discussions similaires

  1. [PC] Comment modifier le ACCEPT ?
    Par SinXJon dans le forum Cobol
    Réponses: 1
    Dernier message: 28/02/2007, 19h29
  2. Limite taille d'un formulaire, comment débloquer?
    Par Terminator dans le forum IHM
    Réponses: 2
    Dernier message: 20/02/2007, 00h22
  3. Ora-054 comment débloquer resource busy?
    Par marion782 dans le forum Oracle
    Réponses: 4
    Dernier message: 22/06/2006, 00h23
  4. [SP2] Comment débloquer une application dans le SP2
    Par Furius dans le forum Windows XP
    Réponses: 6
    Dernier message: 13/11/2005, 22h45
  5. Comment débloquer le ScrollBar d'un RichEdit ?
    Par Droïde Système7 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/07/2005, 11h43

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