Sockets TCP avec multiples clients en Java
Application à réaliser
Le but de ce TP est de réaliser en Java une application distribuée
de type client/serveur avec comme support de communication les sockets
TCP.
Le serveur gère une liste de personne. Une personne est définie par
2 informations : son age et son nom. Le serveur attribue à chaque
personne un identificateur unique.
Un client peut effectuer plusieurs requêtes :
- Proposer l'ajout d'une personne dans la liste gérée par le
serveur. Si la personne existait déjà, le serveur ne fait pas
d'ajout. Le serveur retourne ensuite au client l'identificateur de la
personne (identificateur généré si la personne était
nouvelle).
- Demander l'identificateur d'une personne en envoyant les
informations sur une personne au serveur. Si la personne n'existe pas,
le serveur retourne -1.
- Récupérer les informations concernant une personne à
partir de son identificateur. Si le client n'existe pas, une valeur
particulière est retournée par le serveur.
L'implémentation des opérations de gestion de personnes est déjà
faite via les classes du package donnees
que vous
intégrerez dans votre projet Java
: donnees.zip (voir la
documentation des classes).
Plusieurs clients doivent pouvoir être connectés simultanément au
serveur.
Travail à réaliser
Un client doit pouvoir envoyer un nombre quelconque de requêtes au
serveur.
Vous implémenterez 3 versions pour le serveur (ne nécessitant
– presque – aucune modification du client pour passer de
l'une à l'autre) :
- Une version mono-client qui ne gère qu'un seul client à la
fois. Si plusieurs clients veulent faire des requêtes, l'accès au
serveur est séquentialisé pour les clients : tant qu'un client reste
connecté au serveur, les autres clients restent en attente.
- Une version multi-clients qui lance un thread pour gérer la
communication avec un client lorsqu'il se connecte, ce qui permet à
plusieurs clients d'envoyer des requêtes en parallèle au
serveur. Vous prendrez soin de gérer l'accès concurrent aux données
qui sont les mêmes pour tous les clients.
- Une version multi-clients avec un sélecteur au lieu de passer
par du multi-thread pour gérer les requêtes parallèles des
clients. Pour vous aider dans cette implémentation, récupérez la
classe ServeurSelecteurNIO.java
qui contient les méthodes de lecture/écriture d'un objet sérialisé
dans une socket adaptée aux sélecteurs NIO.
Eric Cariou, dernière modification : 23/01/24