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

Java Discussion :

NIO, SocketChannel et Selector


Sujet :

Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut NIO, SocketChannel et Selector
    Bonjour,

    Je suis confronté à un petit problème avec l'utilisation des Selector sur des sockets.

    J'ai un programme qui doit ouvrir des connections sockets vers des serveurs et se mettre en attente de messages sur ces sockets. (ce sont les specs, je ne peux pas changer ce comportement)
    Pour faire cela, je crée des SocketChannel comme suit:

    SocketChannel socketChannel = SocketChannel.open();
    socketChannel.connect(new InetSocketAddress(server, port));

    Ensuite, je crée un Selector et j'enregistre mes socketChannel avec ce selector pour des événements de type READ.

    Selector selector = Selector.open();
    socketChannel.configureBlocking(false);
    SelectionKey key = socketChannel.register(selector, SelectionKey.OP_READ);

    Je suis alors prêt pour attendre des événements sur mes sockets avec:

    int n = selector.select();

    Cet appel est censé être bloquant or, il sort tout de suite avec n == 0 alors que les serveurs distants n'envoient aucun message.

    Dans la littérature, je ne trouve des exemples que pour des ServerSocketChannel et des SocketChannel issus d'un serverSocketChannel.accept(), bref, pour un serveur pur.

    Avez vous une idée de la manière de procéder dans mon exemple ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par xsirvent Voir le message
    Cet appel est censé être bloquant or, il sort tout de suite avec n == 0 alors que les serveurs distants n'envoient aucun message.
    Ce ne serait pas lié au fait que tu passes la socket en mode non-bloquant : socketChannel.configureBlocking(false); ?


    a++

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Ce ne serait pas lié au fait que tu passes la socket en mode non-bloquant : socketChannel.configureBlocking(false); ?


    a++
    Ben, si je mets configureBlocking(true), ca pête dans le socketChannel.register(selector, ...)

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xsirvent Voir le message
    Ben, si je mets configureBlocking(true), ca pête dans le socketChannel.register(selector, ...)
    C'est à dire ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Exception in thread "main" java.nio.channels.IllegalBlockingModeException
    at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSelectableChannel.java:198)
    at java.nio.channels.SelectableChannel.register(SelectableChannel.java:277)
    at SocketSelectorMain.main(SocketSelectorMain.java:28)

    On ne peut faire de register d'un selector sur un SocketChannel configuré en mode bloquant.

    http://tutorials.jenkov.com/java-nio/selectors.html

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    J'ai recopié ton code tel quel et je ne rencontre pas ce problème.

    Tu aurais un exemple de code complet qui reproduit le problème ?
    C'est quoi comme serveur en face ?


    a++

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    J'ai recopié ton code tel quel et je ne rencontre pas ce problème.

    Tu aurais un exemple de code complet qui reproduit le problème ?
    C'est quoi comme serveur en face ?


    a++
    Bon, de mon coté aussi, je suis reparti sur 2 petits programmes de test (1 client et 1 serveur) et je ne rencontre pas le problème. J'ai du me tromper quelque part mais je n'ai plus le code d'origine et j'avais ouvert la question ici sur mon PC perso à la maison en me remémorant le code qui se trouvait sur le PC du boulot.

    Merci beaucoup d'avoir passé du temps sur mon petit problème.

    Bye
    Xavier

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

Discussions similaires

  1. PB socket java.nio.channels.Selector
    Par bobolebrikiller dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 18/05/2010, 07h47
  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, 10h26
  3. [NIO] données 'texte' vers SocketChannel: s'accumule dans le buffer
    Par fantomasmusic dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/11/2007, 11h21
  4. [NIO][Selector]Probléme d'écoute et processus 100%
    Par mangaspros dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 23/03/2006, 11h05
  5. [nio] Transfert non bloquants d'objets par SocketChannel
    Par Pill_S dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 30/11/2005, 11h19

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