StorUGE est un projet d'architecture réseau distribuée développé en Java NIO (Non-blocking I/O). Il implémente un système de nœuds interconnectés formant une topologie en arbre. Chaque instance du programme possède une double casquette : elle agit simultanément comme un serveur (acceptant des connexions) et comme un client (connecté à un nœud parent).
Ce projet a été réalisé pour illustrer la gestion des entrées/sorties asynchrones à haute performance, permettant de gérer de multiples connexions simultanées sur un seul thread.
Le réseau se construit dynamiquement grâce à deux types de lancements :
- Le Nœud Racine (Root) : Initialise le réseau. Il ouvre un
ServerSocketChannelpour écouter les connexions entrantes, mais ne se connecte à aucun parent. - Les Nœuds Enfants : Se connectent à un nœud "mère" existant (via
OP_CONNECT), tout en ouvrant leur propre port pour accepter de futurs nœuds enfants, étendant ainsi l'arbre réseau. - Multiplexage : Toutes les opérations réseau (Accept, Connect, Read, Write) sont supervisées par un unique
Selector, garantissant qu'aucun thread n'est jamais bloqué.
L'application s'appuie sur des concepts avancés pour éviter l'attente active et optimiser la RAM :
- Machines à états (Readers) : Les trames réseau pouvant arriver fragmentées, l'application utilise des objets
Reader. Si un paquet est incomplet, le lecteur sauvegarde son état en mémoire et libère le thread jusqu'à l'arrivée des octets manquants. - Gestion experte des ByteBuffers : Manipulation précise de la mémoire tampon avec des chorégraphies strictes de bascule (
flip) et de compactage (compact) pour optimiser le transfert d'octets. - Isolation par Contexte : Chaque canal réseau est attaché à un
Contextdédié, possédant ses propres buffers d'entrée/sortie et sa file de messages asynchrone (ArrayDeque). - Mise à jour dynamique des Intentions : Le système bascule intelligemment entre les modes d'écoute (
OP_READetOP_WRITE) en fonction du remplissage des buffers pour minimiser la charge CPU.
Le programme se lance depuis un terminal.
1. Lancer le nœud racine (Premier serveur) :
java -jar ServerStorUGE.jar <port_local>2. Lancer un nœud enfant (Connexion à une mère) :
java -jar ServerStorUGE.jar <port_local> <ip_mere> <port_mere>Projet réalisé dans le cadre du Master 1 Informatique (Université Gustave Eiffel).