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
- 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.