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