Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →