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 :

PB socket java.nio.channels.Selector


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut PB socket java.nio.channels.Selector
    Bonjour,

    Je suis actuellement en cours de dev d'un serveur de socket.
    Il fonctionne très bien. Son mode de fonctionnement est le suivant (résumé).

    Un objet selector est notifié des évènements (clients) sur le socket d'écoute du serveur (ACCEPT,CONNECT,READ,WRITE). Tant que l'évènement n'est pas traité le selector ne passe pas a un autre.

    Lors d'une tentative de connexion un évènement ACCEPT est d'abord généré. Avant de finaliser la connexion, je regarde si le nombre maximum de client est atteins si oui je refuse la connexion si non je valide la connexion par un .accept du socket.

    Mon problème est que je n'arrive pas à refuser la tentative de connexion. En effet, l'évènement ACCEPT reviendra tant que je ne l'aurais pas traité. Comment 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
        /**
         * Fonction principale du thread.
         *
         * <p>Boucle sans fin qui reçoit les évènements du selectorThread</p>
         */
        public void run() {
     
            while (!closeRequested) {
     
                //Exécution des taches
                doInvocations();
     
                //Requête de fermeture du thread
                if (!closeRequested) {
     
                    int selectedKeys;
                    try {
                        selectedKeys = selector.select();
                    } catch (IOException ioe) {
                        listenerError.eventError(ioe);
                        continue;
                    }
     
                    if (selectedKeys == 0) {
                        /*si réveillé par 'selector.wakeup()'
                        et pas d'évènement à traiter*/
                        continue;
                    }
     
                    // Récupère la liste des events
                    final Iterator < SelectionKey > itSKey = selector.selectedKeys()
                            .iterator();
     
                    while (itSKey.hasNext()) {
     
                        final SelectionKey sKey = (SelectionKey) itSKey.next();
                        itSKey.remove();
     
                        eventDistribution(sKey);
                    }
                }
            }
            if (closeRequested) {
                //fermeture
                try {
                    closeSelectorAndChannels();
                } catch (IOException ex) {
                    listenerError.eventError(ex);
                }
            }
        }
     
        /**
         * Fonction permettant de répartir les évènements vers les interfaces.
         *
         * @param sKey Descripteur de l'evènement
         */
        private void eventDistribution(final SelectionKey sKey) {
     
            try {
                final int readyOps = sKey.readyOps();
                //disable l'évènement
                sKey.interestOps(sKey.interestOps() & ~readyOps);
     
                if (sKey.isAcceptable()) {
                    //Évènement ACCEPT
                    if (currentAccept >= MAX_ACCEPT) {
    //!!!! signale juste le refus mais ne fais rien
                        ((ISelectorListenerAccept) sKey.attachment()).eventRefused();
                    } else {
    //!!!!! accept la connexion par .accept()
                        ((ISelectorListenerAccept) sKey.attachment()).eventAccept();
                    }
                } else if (sKey.isConnectable()) {
                    //Évènement CONNECT
                    ((ISelectorListenerConnect) sKey.attachment())
                            .eventConnect();
                } else {
                    if (sKey.isReadable()) {
                        //Évènement READ
                        ((ISelectorListenerReadWrite) sKey.attachment())
                                .eventRead();
                    }
                    if (sKey.isValid() && sKey.isWritable()) {
     
                        //Évènement WRITE
                        ((ISelectorListenerReadWrite) sKey.attachment())
                                .eventWrite();
                    }
                }
            } catch (CancelledKeyException ex) {
              //Fermeture des connexions
                try {
                    closeSelectorAndChannels();
                    listenerError.eventError(ex);
                } catch (IOException exClose) {
                    //+ Erreur à la fermeture
                    exClose.initCause(ex);
                    listenerError.eventError(exClose);
                }
     
            }catch (NullPointerException ex) {
                //Fermeture des connexions
                try {
                    closeSelectorAndChannels();
                    listenerError.eventError(ex);
                } catch (IOException exClose) {
                    //+ Erreur à la fermeture
                    exClose.initCause(ex);
                    listenerError.eventError(exClose);
                }
            }
     
        }

  2. #2
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bon pas de réponse ou piste.
    Alors je vais faire un rustine. C'est moche mais bon ca marche.

    Merci quand même.

Discussions similaires

  1. java.nio : utilisation des Channel
    Par jan0 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 23/05/2016, 14h45
  2. Java nio : TimeOut sur une socket d'un selector
    Par souihli dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 16/10/2008, 11h26
  3. java.nio : Channel
    Par kdick dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/06/2007, 12h47
  4. Réponses: 3
    Dernier message: 20/10/2006, 20h50
  5. [reseau ] java.nio.channels
    Par AMARI_SALIM dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 10/04/2006, 23h43

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