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 :

Lecture non bloquante sur plusieurs Sockets avec nio


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut Lecture non bloquante sur plusieurs Sockets avec nio
    Salut à tous,

    Je voulais faire un petit serveur qui maintient une liste de Sockets, et qui utilise un thread pour lire sur chacun en utilisant nio. Mais voilà, pour utiliser nio, il faut que j'utilise des SocketChannel, et je n'ai pas trouvé de moyen d'obtenir un SocketChannel à partir d'un Socket, est-ce que qqn sait si c'est possible ?

    Merci bien!

  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 ratakses
    Mais voilà, pour utiliser nio, il faut que j'utilise des SocketChannel, et je n'ai pas trouvé de moyen d'obtenir un SocketChannel à partir d'un Socket, est-ce que qqn sait si c'est possible ?
    Il suffit d'utiliser la méthode getChannel() de ta socket

    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Merci pour ta réponse, mais en fait getChannel() me retourne null, parce qu'il est spécifié dans l'api :

    A socket will have a channel if, and only if, the channel itself was created via the SocketChannel.open or ServerSocketChannel.accept methods.
    Et mon problème est que je dispose uniquement de simples Sockets.
    Il faut que je crée des Channel séparement ? Je vois pas très bien comment faire en fait

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Je commence à me demander si je ferais pas mieux de manager un stock de SocketChannels à la place d'un stock de Sockets, mais ça m'embête un peu

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Pourquoi ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Parce que ça implique de changer pas mal de choses dans mon code, j'ai déjà commencé à le faire.

    D'ailleurs je me demandais quelque chose :
    en admettant que je crée un SocketChannel sous forme de variable locale n'existant qu'au sein d'une méthode, que je lui fait un register avec OP_READ et qu'ensuite je stocke ce SocketChannel dans une collection quelconque.
    Est-ce que, lorsque la méthode est terminée (et donc que la variable locale n'existe plus) et que je supprime le SocketChannel de ma collection, l'opération select va continuer à utiliser cet objet ? Oubien est-ce qu'il aura disparu ?

    En d'autres mots,
    Est-ce que l'instance de l'objet elle-même est supprimée (du moins aux yeux du selector) lorsque j'efface l'objet de la collection ?

    (Je précise que mon but est de maintenir un stock de SocketChannel liés à des timers afin de ne pas chaque fois devoir en recréer)

    Merci pour votre aide...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    L'instance ne sera pas supprimée tant qu'il restera une reference. Ce qui est a priori le cas, via le Selector, qui contient un ensemble de SelectorKey, qui reference ton objet SocketChannel.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Ok, merci pour ton aide.

    Je crois que j'ai trouvé une solution en faisant le register() dans la classe qui me sert à stocker mes channels, et en faisant un close() au moment ou le timer expire.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    En fait, j'ai encore un problème sur lequel je coince,

    voici le morceau de code :
    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
    try{
            socketChannel = SocketChannel.open(new InetSocketAddress(destInet, 2000));
    }
    catch(IOException ioe){
    	...
    }
    stockSockets.put(socketChannel);
     
    try{
    	Socket socket = socketChannel.socket();
    	ObjectOutputStream dos = new ObjectOutputStream(socket.getOutputStream());
    	dos.writeObject(message);
    	dos.close();
    }
    catch(IOException ioe){
    	...
    }
    et voici le code de stockSocket.put() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    synchronized public void put(SocketChannel socketChannel){
    		try{
    			socketChannel.configureBlocking(false);
    			socketChannel.register(selector, SelectionKey.OP_READ);
     
    		}
    		catch(){
    			...
    		}
    		...
    }
    Mon problème est que mon programme bloque environ une minute entre le configureBlocking() et le register(), avant de finalement continuer et de me faire une IllegalBlockingModeException au moment où il arrive à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectOutputStream dos = new ObjectOutputStream(socket.getOutputStream());
    Si je retire le configureBlocking(false), le programme lève une IllegalBlockingModeException au moment de faire le register()...

    J'ai pas mal cherché, mais je ne comprend pas vraiment la nature de cette exception, est-ce que qqn aurait une idée ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Je crois que j'ai trouvé : je pense que cette erreur vient du fait qu'on ne peut pas écrire sur le socket associé à un socketChannel non bloquant

Discussions similaires

  1. Lecture non-bloquante de socket UDP
    Par asux18 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 01/05/2011, 20h05
  2. Socket lecture non bloquante
    Par Darkthur dans le forum Multithreading
    Réponses: 2
    Dernier message: 22/05/2009, 18h28
  3. [Réseau] select() et accept() sur plusieurs sockets
    Par Higestromm dans le forum C++
    Réponses: 13
    Dernier message: 13/10/2008, 09h18
  4. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22
  5. Réponses: 3
    Dernier message: 16/03/2004, 16h42

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