:: Enseignements :: Master :: M1 :: 2015-2016 :: Programmation Orientée Objet - Design Patterns ::
[LOGO]

Un serveur de commandes



Exercice 1 - Un serveur de commandes

Le but de cet exercice est de créer un serveur TCP/IP permettant d'exécuter diverses commandes.
Commme le but de cet exercice n'est pas de créer un serveur TCP/IP, nous utiliserons un code déjà écrit.

avec le main suivant:

  1. Tester le code du serveur grâce à la commande nc (pour netcat).
    					nc localhost 8888
    					hello
    				
    et utiliser Ctrl-D (Ctrl-Z sous Windows) pour terminer la communication.
  2. Modifier le code pour que si la chaine de caractère envoyée par le client soit "echo" suivi d'un texte, le serveur renvoie le texte au client. Et de plus, on souhaite envoyer un message d'erreur si la commande n'est pas "echo".
  3. Expliquer pourquoi modifier le code de la classe Server.java à chaque introduction d'une nouvelle commande n'est pas une bonne idée en terme de conception objet.
    Dans le but de considerer le code du serveur comme un module fermé, quelles sont les modification qui s'imposent pour que l'introduction de nouvelles commandes ne change plus le code du serveur ?
    Refactoriser le code pour pouvoir fermer la classe Server et modifier la classe Main en conséquence.
  4. On souhaite introduire une nouvelle commande date qui doit répondre avec la date courante en retour (en utilisant java.time.LocalDate).
    Au niveau du code, on veut que chaque commande soit isolée et localisée (donc facilement modifiable) et de telle façon à ce que l'on puisse ajouter de nouvelle commande en changeant juste le code du main.
    Comment faire pour associer une commande à son nom ?
    Faite le diagramme UML correspondant puis écrire le code.
  5. On peut remarquer qu'il n'est pas nécessaire de créer une classe pour chaque commande.
    Pourquoi ?
    Dans ce cas où doit on écrire les implantations ?
    Quel est le nom du design pattern que nous allons utiliser ici ?
    Modifier votre implantation en conséquence.
  6. En fait chaque commande à un nom associé, donc on se dit que créer une classe Command avec un nom semble une bonne idée, pourtant ce n'est pas le cas, pourquoi ?
  7. On souhaite introduire une nouvelle commande "hello", le serveur réponde avec "hello" suivi de l'adresse IP du client (La méthode SocketChannel.getRemoteAddress() permet d'obtenir l'adresse IP du client).
    Que doit-on changer dans le design, que doit on ré-ouvrir ?
    Comment faire pour que l'implantation des commandes ne dépende pas d'une classe spécifique au serveur ?
  8. On souhaite aussi pouvoir (ou non, le choix se fait dans le main) loggué tous les appels par les différents clients à notre serveur, comme un serveur Web log les accès à une page Web.
    Quel design pattern allons nous utiliser ?
    Qu'allons nous modifier pour l'introduire dans notre programme ?
    PS: comment gérer les accès concurents ??
  9. Enfin ajouter les commandes startTimer, elapsed et stopTimer définie comme ceci:
    • startTimer démarre un timer et renvoie son id unique.
    • stopTimer timerId qui permet de stopper un timer créer au préalable avec startTimer
    • elapsed timerId qui renvoie le temps en nano seconde écoulé depuis l'exécution du startTimer correspondant.
    • Note: il existe une méthode System.nanoTime.