Adloun

programmation Java (école d'ingénieur) · Chapitre 16 · Application directe du cours

Un seul client à la fois

Réseau : sockets client/serveur · niveau 2

Énoncé

Le serveur d'écho du cours tourne. Un premier client se connecte, envoie une ligne, lit la réponse, puis reste connecté deux secondes sans rien faire. Pendant ce temps, un second client se connecte et envoie « et moi ? ».

  • La connexion du second client est-elle refusée ?
  • Quand reçoit-il sa réponse ? Pourquoi ?
  • Écrire un programme qui réalise cette expérience et mesure les délais, puis proposer une correction du serveur.

Corrigé

  • Non : le système d'exploitation accepte la connexion et la place dans une file d'attente (associée au ServerSocket), même si le programme n'a pas encore appelé accept.
  • Seulement quand le premier client s'est déconnecté : le fil unique du serveur est occupé dans la boucle de lecture du premier ; il n'appellera accept pour le second qu'après.
  • Le programme lance le premier client dans un fil, attend 0,3 s, puis joue le second client en mesurant les temps :

Thread premier = new Thread(() -> {
    try (Socket s = new Socket("localhost", 5000)) {
        ecrivain(s).println("je reste");
        lecteur(s).readLine();
        Thread.sleep(2000);                        // garde la connexion 2 s
    } catch (Exception e) { System.out.println(e); }
});
premier.start();
Thread.sleep(300);                                 // le premier est servi d'abord
long debut = System.currentTimeMillis();
try (Socket s = new Socket("localhost", 5000)) {   // la connexion est acceptée par le système...
    System.out.println("second client connecté après " + (System.currentTimeMillis() - debut) + " ms");
    ecrivain(s).println("et moi ?");
    String r = lecteur(s).readLine();              // ... mais la réponse attend
    System.out.println("réponse « " + r + " » après " + (System.currentTimeMillis() - debut) + " ms");
}

(ecrivain et lecteur emboîtent les flux de la socket comme dans le cours.)


second client connecté après 0 ms
réponse « écho : et moi ? » après 1712 ms

La connexion est immédiate, mais la réponse attend la fin du premier client ( s). La correction est celle du serveur de calcul : confier chaque client à un fil, avec new Thread(() -> servir(client)).start() dans la boucle d'accept.

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 →