TD "programmation réseau" Numéro 2
Un serveur acceptant des connexions multiples de clients


Auteurs : Patrick Itey
 

Objectifs : Ecrire une application réseau sur un modèle client-serveur multithread avec Java 1.1

Cet exercice vouspermettra de mettre en application :

  • la création et l'utilisation de threads Java (java.lang.Thread)
  • l'utilisation des sockets Java (java.net)
  • Notions à connaître absolument: allez voir cette page de rappels sur l'utilisation des sockets en Java
     

    Présentation :
    L'exercice du TD No 1 (trés simpliste) comporte plusieurs limitations, à savoir

    Dans cet exercice, nous allons construire un serveur qui s'occupera simultanément d'un nombre illimité de clients.
    L'unique service qu'il rendra sera de renvoyer en majuscules tous les messages qu'un client lui envoie. Un client se déconnecte du serveur par l'envoie du message "fin".
     

    Travail à réaliser :
    Lorsqu'une application cliente (classe MajClient.java) demande une connexion , le serveur (classe MajServeur.java) lui en construit une (méthode accept() de java.net.ServerSocket).
    La demande de connexion par le client est une création d'une instance de la classe java.net.Socket indiquant la machine hôte et un numéro de port. (voir utilisation des sockets en Java)

    Le serveur utilisera un thread Connexion (Connexion.java) (classe dérivée de java.lang.Thread ou implémentant l'interface Runnable), capable de gèrer un échange de données en tâche de fond comme le montre la figure ci-dessous :
     
     



    C'est le thread Connexion qui réalisera le service de transformation des caractères en majuscules.

    Le lancement du serveur sur l'hôte de nom mycpu s'effectue ainsi :

    mycpu> java MajServeur
    Serveur à l'écoute sur le port : 45678

    Le serveur est ainsi en attente de connexions de la part des clients. Un client demande une connexion ainsi :

    >java MajClient mycpu
    Connexion : mycpu/189.154.12.87 port: 45678
    ?toto
    !TOTO
    ?pit
    !PIT
    ?fin
    Connexion terminée

    Le "?" indique que le client attend un message de l'utilisateur. Le "!" préfixe le service rendu par la connexion.
     

    Corrections :

    La classe Connexion est une classe dérivée de la classe java.lang.Thread :

    La classe Connexion implémente l'interface java.lang.Runnable :