Gestion de protocoles, RMI 1 Gestion de protocoles

Transcription

Gestion de protocoles, RMI 1 Gestion de protocoles
Institut Galilée
Année 2011-2012
E-services
Master 2
T.P. 2
Gestion de protocoles, RMI
1
Gestion de protocoles
L’objectif est de mettre en place une version légère d’un résolveur DNS en
utilisant un protocole adapté. On veut ainsi qu’un programme client puisse
faire :
– Appel au DNS pour une conversion adresse IP vers nom symbolique :
1
2
3
4
$ java - cp . Tes tURLHan dler dns : // 2 0 9 . 8 5 . 2 2 7 . 1 0 6 ? IPtoH
Type de requete : IPtoH
valeur demandee : 209. 85.227.1 06
valeur retournee : wy - in - f106 . google . com
– Appel au DNS pour une conversion nom symbolique vers adresse IP :
1
2
3
4
$ java - cp . Tes tURLHand ler dns : // www . google . fr ? HtoIP
Type de requete : HtoIP
valeur demandee : www . google . fr
valeur retournee : 209 .85.229 .106
– Appel au DNS pour une recherche de serveur d’envoi de mail pour un
domaine donné :
1
2
3
4
$ java - cp . Tes tURLHand ler dns : // univ - paris13 . fr ? MX
Type de requete : MX
valeur demandee : univ - paris13 . fr
valeur retournee : upn . univ - paris13 . fr
Le code client peut être :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java . net .*;
import java . io .*;
import up13 . dns .*;
public class T estURLH andler {
public static void main ( String args []){
System . getProperties (). put ( " java . protocol . handler . pkgs " , " up13 " );
try {
if ( args . length !=1) error ( " Usage : java Test URLHand ler dns :// mamachine ou dns :// mamachine ? MX " );
URL url = new URL ( args [0]);
DnsEntry dnsEntry = ( DnsEntry ) url . getContent ();
System . out . println ( " Type de requete : " + dnsEntry . getType ());
System . out . println ( " valeur demandee : " + dnsEntry . getQueryValue ());
System . out . println ( " valeur retournee : " + dnsEntry . get ResultVa lue ());
} catch ( M a l f o r m e d U R L E x c e p t i o n ex ){ System . out . println ( ex ); error ( " Bad URL " );
} catch ( IOException ex ){ System . out . println ( ex ); error ( " IOException occurred . " ); }
}
public static void error ( String s ){
System . out . println ( s ); System . exit (1);
}
}
Pour cela :
– il faut que les classes (sauf la classe client) soient dans un paquetage
de la forme monPaquetage.protocole (p.e. up13.dns) et de mettre la
référence du paquetage dans les paquets accessibles lors de l’exécution (cf
les commandes précédentes)
– il faut une classe pour la structure de donnée “entrée de DNS” : p.e. une
classe DnsEntry ayant comme champs le type (ce qu’il y a après ’ ?’ dans
l’url), la requête, le résultat, et comme méthodes les get et set associées
à ces champs.
– pour que le client puisse créer une instance pour une URL avec un certain
protocole (ici dns), il faut que la classe URL accède au bon gestionnaire de
1
protocole. La classe URL recherche une classe nomduprotocole.Handler
dans les paquetages standards ou ceux donnés par la propriété
java.protocol.handler.pkgs : donc qu’il y ait une classe Handler dans
le répertoire up13/dns/ qui étende URLStreamHandler pour ouvrir une
“connection”, i.e. avoir une méthode openConnection() qui retourne une
instance d’une classe spécifique DnsURLConnection.
– une instance de la classe DnsURLConnection est une instance de sa superclasse (URLConnection) avec une initialisation du gestionnaire de contenu
(cf exemple CharGrid, ici une instance de DnsContentHandlerFactory),
et en redéfinissant les méthodes getInputStream() (qui doit retourner null) et getHeaderField() (qui doit retourner "dns") (sinon les
méthodes par défaut créent des erreurs de lecture de contenu, la lecture
de contenu n’est pas nécessaire ici).
– la classe DnsContentHandlerFactory ne fait que créer un gestionnaire
de contenu (comme avec l’exemple CharGrid) à partir d’une classe
DnsContentHandler.
– la classe DnsContentHandler a comme principale méthode getContent()
qui en fonction de la connexion (donc de l’url) va effectuer concrètement
la requête DNS.
La requête DNS peut s’effectuer en utilisant sous Linux la commande dig :
– dig +short nomdemachine renvoie la liste des IP
– dig +short -x numeroIP renvoie le nom symbolique
– dig +short -t MX nomdedomaine renvoie le serveur d’envoi de mail
2
RMI
Tester le programme sur 3 machines (client, httphost, codehost) donné dans
le polycopié.
2