programmation Java (école d'ingénieur) · Chapitre 16 · Exercice de TD
Compter à distance
Réseau : sockets client/serveur · niveau 2
Énoncé
Écrire un serveur (port ) qui reçoit des lignes de texte jusqu'à une ligne FIN, puis répond une seule ligne « n lignes, m mots » et ferme la connexion. Écrire le client, qui envoie le contenu d'un fichier. Pourquoi faut-il une ligne FIN plutôt que d'attendre que le client ferme la connexion ?
Corrigé
Côté serveur, la boucle s'arrête sur FIN (ou si le client part), puis le serveur répond :
try (Socket s = serveur.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(), StandardCharsets.UTF_8));
PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), StandardCharsets.UTF_8), true)) {
int lignes = 0, mots = 0;
String l;
while ((l = in.readLine()) != null && !l.equals("FIN")) {
lignes++;
if (!l.isBlank()) mots += l.strip().split("<br>s+").length;
}
out.println(lignes + " lignes, " + mots + " mots");
}
Côté client :
for (String l : Files.readAllLines(Path.of(args.length > 0 ? args[0] : "fable.txt"))) out.println(l);
out.println("FIN");
System.out.println("Le serveur a compté : " + in.readLine());
Avec le fichier fable.txt du chapitre 14 :
Le serveur a compté : 6 lignes, 26 mots
Si le client fermait sa socket pour signaler la fin, il ne pourrait plus lire la réponse : fermer une socket ferme ses deux sens. La ligne FIN marque la fin des données dans le protocole. (Il existe aussi s.shutdownOutput(), qui ne ferme que le sens d'envoi.)
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.