programmation Java (école d'ingénieur) · Chapitre 16 · Application directe du cours
Un seul client à la fois
Réseau : sockets client/serveur · niveau 2
Énoncé
Le serveur d'écho du cours tourne. Un premier client se connecte, envoie une ligne, lit la réponse, puis reste connecté deux secondes sans rien faire. Pendant ce temps, un second client se connecte et envoie « et moi ? ».
- La connexion du second client est-elle refusée ?
- Quand reçoit-il sa réponse ? Pourquoi ?
- Écrire un programme qui réalise cette expérience et mesure les délais, puis proposer une correction du serveur.
Corrigé
- Non : le système d'exploitation accepte la connexion et la place dans une file d'attente (associée au
ServerSocket), même si le programme n'a pas encore appeléaccept. - Seulement quand le premier client s'est déconnecté : le fil unique du serveur est occupé dans la boucle de lecture du premier ; il n'appellera
acceptpour le second qu'après. - Le programme lance le premier client dans un fil, attend 0,3 s, puis joue le second client en mesurant les temps :
Thread premier = new Thread(() -> {
try (Socket s = new Socket("localhost", 5000)) {
ecrivain(s).println("je reste");
lecteur(s).readLine();
Thread.sleep(2000); // garde la connexion 2 s
} catch (Exception e) { System.out.println(e); }
});
premier.start();
Thread.sleep(300); // le premier est servi d'abord
long debut = System.currentTimeMillis();
try (Socket s = new Socket("localhost", 5000)) { // la connexion est acceptée par le système...
System.out.println("second client connecté après " + (System.currentTimeMillis() - debut) + " ms");
ecrivain(s).println("et moi ?");
String r = lecteur(s).readLine(); // ... mais la réponse attend
System.out.println("réponse « " + r + " » après " + (System.currentTimeMillis() - debut) + " ms");
}
(ecrivain et lecteur emboîtent les flux de la socket comme dans le cours.)
second client connecté après 0 ms
réponse « écho : et moi ? » après 1712 ms
La connexion est immédiate, mais la réponse attend la fin du premier client ( s). La correction est celle du serveur de calcul : confier chaque client à un fil, avec new Thread(() -> servir(client)).start() dans la boucle d'accept.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.