:: Enseignements :: ESIPE :: E4INFO :: 2012-2013 :: Applications réseaux ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
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:
-
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.
-
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.
-
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.
© Université de Marne-la-Vallée