programmation Java (école d'ingénieur) · Chapitre 16 · Application directe du cours
Le message qui ne part pas
Réseau : sockets client/serveur · niveau 2
Énoncé
Un client du serveur d'écho crée son PrintWriter ainsi :
PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), StandardCharsets.UTF_8));
puis envoie out.println("Bonjour") et lit la réponse. Le programme reste bloqué. Expliquer pourquoi, puis donner deux corrections. Vérifier avec un délai d'attente d'une seconde.
Corrigé
Sans le second argument true, le PrintWriter n'a pas de vidage automatique : « Bonjour » reste dans son tampon en mémoire et ne part pas sur le réseau. Le serveur attend une ligne qui n'arrive pas, le client attend une réponse qui ne viendra pas : chacun attend l'autre. Corrections : construire le PrintWriter avec true (vidage à chaque println), ou appeler out.flush() après chaque message. Vérification, avec un délai d'attente d'une seconde, sans puis avec vidage :
for (boolean vidage : new boolean[]{false, true}) {
try (Socket s = new Socket("localhost", 5000)) { // le serveur d'écho
s.setSoTimeout(1000);
PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), StandardCharsets.UTF_8), vidage);
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(), StandardCharsets.UTF_8));
out.println("Bonjour");
try {
System.out.println("vidage automatique " + vidage + " : " + in.readLine());
} catch (SocketTimeoutException e) {
System.out.println("vidage automatique " + vidage + " : aucune réponse (" + e.getMessage() + ")");
}
}
}
vidage automatique false : aucune réponse (Read timed out)
vidage automatique true : écho : Bonjour100 % 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.