Adloun

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 : Bonjour

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 →