Comme présenté succinctement dans le dernier cours et sugéré à la fin du polycopié sur les NIO, voici des "morceaux de bouts de code" Java correspondant à différentes versions d'un serveur TCP (de mise en majuscule) utilisant les nouvelles classes d'entrée-sortie de Java, les NIO.
Bien évidemment, le code n'est pas propre et ne saurait être utilisé dans un autre but que l'illustration de l'utilisation des canaux sur les sockets TCP et des sélecteurs.
Le thème récurrent est un serveur de mise en majuscules : il accepte de ses clients des octets représentant des chaînes de caractères, et il renvoit les octets correspondant à ces chaînes mises en majuscule. Plusieurs versions sont présents ci-dessous :
main()
).
main()
pour accepter les nouvelles connexions plus une
nouvelle thread pour chaque connexion acceptée, i.e., client).
main()
), mais de
traiter les lectures de manière non bloquante sur toutes les
connexions établies avec les clients (dans une seule autre thread).
select()
et
celle qui enregistre (register()
) le canal du nouveau
client auprès de ce même sélecteur requière des arcanes de
programmation (barrière de synchronisation) sans pour autant être
certain qu'on évite le dead lock à coup sûr.
select()
(cela évite les problèmes de synchronisation ou de dead
lock), pour cela, on passe par un conteneur thread safe
(ici, une ConcurrentLinkedQueue
) pour transmettre les
canaux des clients fraîchement acceptés.
main()
.
La version totalement non bloquante d'un serveur Echo proposée par la classe EchoNonBlockingServer.java propose un code plus propre, et illustre de manière plus complète, bien que simple, la mise en attente pour la lecture, l'écriture ou la connexion, ainsi qu'une autre utilisation de l'attachement lors de l'enregistrement.