- louk,
Bonjour, bonsoir, chers zagrumes !
Pour mes cours de réseaux Java (Licence 3 Informatique), on apprend à utiliser les sockets réseaux, de même que l’on a appris à les utiliser en C (sockets POSIX).
En C, je sais parfaitement utiliser la fonction select
et les sets
qui vont avec. De cette façon, je sais lire à la fois le clavier ou une socket quelconque en lecture et/ou écriture. C’est simple : en UNIX, tout est fichier et à chaque fichier correspond un entier que l’on appelle "file descriptor".
En Java, les choses se ressemblent mais sont différentes. On utilise la classe Selector
dont la méthode statique open()
permet de créer un nouveau sélecteur, dans lequel on ajoute des SelectableChannel
(comme des SocketChannel
, par exemple) grâce à la méthode SelectableChannel.register(Selector sel, SelectionKey interestOps)
, puis on récupère les SelectionKey
des canaux prêts correspondants grâce à Selector.select()
et Selector.selectedKeys()
.
De la même manière qu’en C, j’aimerais pouvoir ajouter stdin (System.in
en Java) dans le sélecteur pour récupérer les sockets et/ou l’entrée standard prêtes pour la lecture. Seulement voilà, System.in
est (indirectement) un InputStream
et ne contient pas de SelectableChannel
.
Comment puis-je donc procéder pour attendre qu’une entrée soit prête, System.in et quelconque Socket confondues ?
PS : Le prof de réseau Java ne nous a pas du tout parlé de tout ça, mais connaissant le concept en C, j’ai bien envie de savoir l’utiliser en Java également. L’UE réseau est découpée en 2 : partie C / partie Java. Ce sont des profs différents pour chaque langage.