:: Enseignements :: ESIPE :: E4INFO :: 2012-2013 :: Applications réseaux ::
[LOGO]

Proxy TCP et petit serveur HTTP


Exercice 1 - Proxy TCP vers une adresse fixe

On souhaite écrire un proxy TCPProxySimple vers une adresse fixe. Le proxy prendra en argument son numéro de port, puis l'adresse et le port du serveur vers lequel on relaie les connections et enfin le nombre de threads à lancer. Par exemple, on pourra le lancer avec la ligne de commande suivante:
% java fr.upem.tcp.TCPProxySimple  7777 localhost 8888 25
Le principe du proxy est de relayer toutes les connections faites sur le port 7777 vers l'adresse du serveur cible (dans notre cas localhost:8888). Pour fixer les choses, on appellera client la machine se connectant sur le port 7777 du proxy et serveur la machine dont l'adresse est passée en argument.

Pour vous aider, nous vous fournissons le squelette SqueletteTCPPProxy.java d'un serveur basé sur l'idée de launchConcurrentFixedPrestartedPool() du TD 6. Ce serveur implémente un fonction shutdown(). Le main lance un thread lisant des commandes au clavier. Seule la commande Shutdown est supportée.

Exercice 2 - Proxy TCP vers plusieurs adresses

On veut maintenant réaliser un proxy TCPProxyMulti qui permette aux clients de spécifier l'adresse vers laquelle la connexion doit être relayée.

Le protocole est le suivant: lorsque le client se connecte au proxy, il envoie un message à l'un des formats suivant au serveur:
  1. l'octet 0, un octet (non-signé) de valeur n, puis n octets représentant l'adresse du serveur en ASCII et enfin le port sous la forme de 4 octets représentant un int en BigEndian.
  2. l'octet 4, 4 octets représentant l'adresse IPv4 et enfin le port sous la forme de 4 octets représentant un int en BigEndian.
  3. l'octet 6, 16 octets représentant l'adresse IPv6 et enfin le port sous la forme de 4 octets représentant un int en BigEndian.
Le serveur renvoie l'octet 0 si la connexion avec le serveur souhaité est bien établie et l'octet 1 sinon (et il ferme la connexion).

Implémenter un classe ProxiedSocket en partant de SqueletteProxiedSocket.java qui surcharge certains constructeurs pour établir une connexion à un serveur via le proxy.

Utiliser la classe ProxiedSocket pour adapter TCPUpperCaseClient pour utiliser votre proxy.

Exercice 3 - Proxy TCP avec des statistiques

On souhaite ajouter une fonction Stats dans une classe TCPProxyMutliStats à notre proxy qui donne des informations sur l'activité des threads du proxy. Comme par exemple, on souhaite
Thread 0 [Done] is connected to localhost/127.0.0.1:8888 from /127.0.0.1:50788 with 65 bytes read and 65 bytes written
Thread 1 is idle.
Thread 2 is idle.
Thread 3 is initializing a connection from /0:0:0:0:0:0:0:1:50796
Thread 4 [Active] is connected to localhost/127.0.0.1:8888 from /127.0.0.1:50790 with 15 bytes read and 15 bytes written

Exercice 4 - Proxy TCP avec un serveur HTTP

On veut maintenant pouvoir consulter les statistiques de notre proxy avec notre navigateur. Notre proxy lancera donc sur le port 8080 un serveur HTTP minimaliste qui réponds à toutes requêtes GET un page HTML donnant les statistiques du proxy.

Dans un premier temps, un serveur HTTP dont la méthode launch prend en argument un objet prod implémentant l'interface HTMLProducer().

Ce serveur en réponse à n'importe qu'elle requête renvoie le HTML produit par l'appel à prod.produceHTML(). Pour des rappels sur le fonctionnement de HTTP, allez voir la page du cours.

Transformer le proxy TCPProxyMultiS en un classe TCPProxyHTTP de manière à ce que TCPProxyHTTP implémente l'interface HTMLProducer. Modifier le code pour lancer le serveur HTTP donnant les statistiques.