Adloun

programmation Java (école d'ingénieur) · Chapitre 16 · Exercice de TD

Ne pas attendre indéfiniment

Réseau : sockets client/serveur · niveau 2

Énoncé

Un serveur « muet » accepte les connexions mais ne répond jamais. Écrire un client qui lui envoie une ligne et n'attend pas la réponse plus d'une seconde, puis affiche un message clair. Quelle méthode faut-il appeler, et quelle exception attraper ?

Corrigé

On fixe le délai avec setSoTimeout avant de lire, et l'on attrape SocketTimeoutException.


try (Socket s = new Socket("localhost", 5004)) {
    s.setSoTimeout(1000);                              // au plus 1 s par lecture
    new PrintWriter(s.getOutputStream(), true).println("Il y a quelqu'un ?");
    long debut = System.currentTimeMillis();
    try {
        new BufferedReader(new InputStreamReader(s.getInputStream())).readLine();
    } catch (SocketTimeoutException e) {
        System.out.println("Pas de réponse après " + (System.currentTimeMillis() - debut) / 100 * 100
                + " ms : " + e.getMessage());
    }
}

Contre un serveur muet (qui fait accept puis sleep) :


Pas de réponse après 1000 ms : Read timed out

Le délai s'applique à chaque lecture, pas à la connexion entière. Après un dépassement du délai, la socket reste utilisable : on peut réessayer, ou abandonner et fermer.

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 →