:: Enseignements :: Master :: Master TTT :: 2008-2009 :: Programmation Réseaux en Java ::
[LOGO]

Examen -- Master 2 TTT -- Programmation des réseaux avec Java -- Tronc Commun


23 Mars 2009

Remarques importantes : Aucun document n'est autorisé. Les questions et l'exercice sont indépendants et peuvent être réalisés dans n'importe quel ordre. Prenez le temps de bien lire les questions avant de répondre !

Questions de cours

Vous pouvez si besoin faire des schémas pour expliquer vos réponses.

Question 1 Que représente la classe InetAdress ? Expliquez ce qui se passe lorsque le code suivant est exécuté :
import java.net.InetAddress;

public class Question1 {
  public static void main(String[] args) {
    InetAddress ia = InetAddress.getByName("la.machine.fr");
  }
}

Question 2 Expliquez en quelques mots ce qu'est un "jeu de caractères" (ou charset en anglais), et à quoi correspondent les opérations d'encodage et de décodage que peuvent prendre en charge certains flots en Java. Pourquoi ces notions sont elles particulièrement importantes dans le contexte des applications réseaux ?

Question 3 Citez cinq différences importantes entre TCP et UDP.

Question 4 Expliquez comment fonctionne une communication UDP du point de vue d'un client puis donnez les classes java représentant les entités mises en jeu.

Question 5 Expliquez comment fonctionne une communication UDP du point de vue d'un serveur puis donnez les classes java représentant les entités mises en jeu.

Question 6 Expliquez comment fonctionne une communication TCP du point de vue d'un client puis donnez les classes java représentant les entités mises en jeu.

Question 7 Expliquez comment fonctionne une communication TCP du point de vue d'un serveur puis donnez les classes java représentant les entités mises en jeu.

Exercice

Le but de cet exercice est d'écrire un serveur qui compte le nombre de lignes de texte reçues de ses clients. Ce serveur se démarre par la commande :
java LineCounterServer max tcpPort groupAddress groupPort
  • Il se place alors en attente d'acceptation de clients sur le port tcpPort de la machine locale.
  • Pour chaque client accepté, il lit le flot de données reçues de ce client en considérant qu'il s'agit de texte encodé en ASCII.
  • À chaque ligne reçue d'un client, il incrémente un compteur (qui est le même pour tous les clients connectés).
  • Lorsque le compteur atteint la valeur max, il envoie la chaîne de caractères "Max lines received" en multicast au groupe défini par l'adresse groupAddress et le numéro de port groupPort, puis réinitialise le compteur à zéro.
Il est important que la gestion des clients par le serveur soit concurrente, et on pourra utiliser une nouvelle thread pour chaque nouveau client accepté.

Écrire la classe LineCounterServer du serveur,
  • avec un constructeur qui initialise ce serveur et crée les sockets utiles,
  • une méthode launch qui démarre le serveur (le met en attente de clients),
  • une méthode main qui crée un objet serveur à partir des arguments sur la ligne de commande et le démarre,
  • plus toute autre méthode que vous jugerez utile. Vous porterez une attention particulière à la gestion concurrente des clients et du compteur, ainsi qu'à la gestion des exceptions et la fermeture des connexions.

Conseil : commencez par réfléchir aux méthodes dont vous avez besoin et à ce qu'elles doivent faire...