Examen de Septembre 2004 page 1 IPST-CNAM Conception d'applications distribuées en Java Cycle C / TL16954 Mardi 14 Septembre 2004 Sans document Durée : 2 heures Enseignants : LAFORGUE Jacques MILLAN Thierry Session de SEPTEMBRE I. QCM [10 points] (20 minutes) Mode d'emploi : Ce sujet est un QCM dont les questions sont de 3 natures : les questions à 2 propositions: dans ce cas une seule des 2 propositions est bonne. si aucune réponse alors + 0 si 1 réponse bonne alors +1 si 1 réponse fausse alors –1 les questions à 3 propositions dont 1 seule proposition est bonne si aucune réponse alors + 0 si 1 réponse bonne alors + 1 si 1 réponse fausse alors –½ si 2 réponses fausses alors –1 les questions à 3 propositions dont 2 propositions sont bonnes. si aucune réponse alors + 0 si 1 réponse bonne alors + ½ si 2 réponses bonnes alors +1 si 1 réponse fausse alors –1 Dans tous les cas, il existe au moins 1 réponse bonne et au moins 1 réponse fausse. On ne compte les valeurs négatives que à partir de 10% du nombre de question du QCM. On peut remarquer que cocher toutes les propositions d'une question revient à ne rien cocher (égal à 0). Il s'agit de faire une croix dans les cases de droite en face des propositions. Si vous devez raturer une croix, faites-le correctement afin qu'il n'y ait aucune ambiguïté. N'oubliez pas d'inscrire en en-tête du QCM, votre nom et prénom, votre numéro de groupe de TP. Si vous avez changé de groupe de TP en cours d'année, indiquez les 2 numéros de groupe en précisant à partir de quel projet vous avez changé de groupe. Ce QCM est constitué de 20 questions. Vous avez donc le droit de vous tromper sans pénalités jusqu'à la hauteur de –2 points. page 1 Examen de Juin 2004 NOM: page 2 PRENOM: QCM GROUPE DE TP : Un package JAVA 1 est une archive de fichier .class dite "fichier .jar" 2 est une librairie de classes JAVA sous la forme d'un fichier binaire 3 est un répertoire de fichiers JAVA (.class) Q1 L'en-tête de déclaration d'une méthode main d'une classe JAVA peut-être: 1 void main(int nb_args, String args[]) 2 static public void main(int nb_args, String args[]) 3 static public void main(String args[]) Q2 Un exception JAVA : 1 hérite de la classe Object 2 hérite de la classe Exception 3 hérite de la classe Thread Q3 Individu tab[] = new Individu[100]; Individu ind = new Individu(); ind.nom = "LAFONT" tab[0] = ind; tab[0].nom = "DUPONT" System.out.println(ind.nom); Q4 Ce code affiche: 1 DUPONT 2 LAFONT Soit la déclaration de la classe suivante : public class MonThread extends Thread { public void run() { // traitement du thread } } Q5 Pour créer le thread et l'exécuter, il faut faire les instructions suivantes: MonThread p = (MonThread)(new Thread()); 1 p.start() 2 Runnable p = new Runnable (); MonThread q = new Thread(p); q.start(); 3 MonThread p = new MonThread (); p.start(); En JAVA, avec RMI, un objet distribué 1 est un objet JAVA qui est échangé entre le serveur et le client 2 est un objet JAVA créé puis enregistré dans l'adaptateur par l'utilisation de l'instruction rebind page 2 Q6 Examen de Juin 2004 page 3 QCM En JAVA, avec RMI, un objet distribué 1 doit implémenter une interface contenant les méthodes distantes de l'objet distribué 2 doit implémenter l'interface Serializable Q7 Dans une architecture distribuée 1 les squelettes sont utilisés par le client 2 les amorces sont utilisés par l'objet distribué 3 les squelettes sont utilisés par l'objet distribué Q8 En JAVA, avec RMI, le compilateur IDL (rmic) 1 permet de créer les objets distribués 2 permet de créer les amorces et les squelettes Q9 Choisir le(s) code(s) correct(s) de la méthode main de GrilleOD.java qui crée l'objet distribué GRILLE 1 String hostRegistry = args[0]; String portRegistry = Integer.parseInt(args[1]); urlRegistry="rmi://"+hostRegistry+":"+portRegistry+"/"; Naming.rebind(urlRegistry+"GRILLE"); 2 String hostRegistry = args[0]; String portRegistry = Integer.parseInt(args[1]); Naming.rebind(new GrilleOD(20,20, hostRegistry, portRegistry)); 3 String hostRegistry = args[0]; String portRegistry = Integer.parseInt(args[1]); urlRegistry="rmi://"+hostRegistry+":"+portRegistry+"/"; Naming.rebind(urlRegistry+"GRILLE", new GrilleOD(20,20,urlRegistry)); Q 10 Choisir le(s) code(s) corrects de la méthode main d'un client de l'objet distribué GRILLE 1 String hostRegistry = args[0]; String portRegistry = Integer.parseInt(args[1]); // Connexion a l'objet distribué urlRegistry="rmi://"+hostRegistry+":"+portRegistry+"/"; GrilleODInt grilleod = (GrilleODInt)Naming.lookup(urlRegistry+"GRILLE"); 2 String hostRegistry = args[0]; String portRegistry = Integer.parseInt(args[1]); // Connexion a l'objet distribué urlRegistry="rmi://"+hostRegistry+":"+portRegistry+"/"; GrilleODInt grilleod = (GrilleODInt)Naming.lookup(urlRegistry); 3 // Connexion a l'objet distribué GrilleODInt grilleod = (GrilleODInt)Naming.lookup("GRILLE"); Q 11 Toutes les méthodes distantes d'un objet distribué 1 doivent appartenir à la même interface 2 peuvent appartenir à plusieurs interfaces 3 doivent toutes être implémentées dans le même objet distribué Q 12 Un démon Http est un serveur de socket 1 OUI 2 NON Q 13 En JAVA, le passage des paramètres dans les méthodes se fait: 1 toujours par référence 2 toujours par valeur Q 14 page 3 Examen de Juin 2004 page 4 QCM En JAVA, les paramètres d'une interface quelconque doivent toujours correspondre à des objets sérialisés 1 OUI 2 NON Q 15 Dans une architecture distribuée, le client et l'objet distribué 1 ont des espaces mémoires disjoints 2 se partagent le même espace mémoire 3 peuvent s'exécuter sur la même machine virtuelle JAVA Q 16 En JAVA, un thread est un objet JAVA dont la classe d'appartenance 1 hérite de la classe Thread 2 est la classe prédéfinie ThreadObject 3 implémente l'interface Runnable Q 17 Avec RMI, les services d'un objet distribué sont: 1 décrits dans une interface Java accessible par le client 2 des méthodes privées implémentées par l'objet distribué 3 des méthodes publiques implémentées par le client Q 18 En JAVA, un tableau 1 peut contenir des éléments de type primitif 2 peut contenir des références d'objet JAVA 3 ne peut pas contenir des références d'objet JAVA Q 19 Si on utilise 2 adaptateurs d'objets distribués sur la même machine, ils doivent s'exécuter sur des ports différents 1 OUI 2 NON Q 20 page 4 Examen de Juin 2004 page 5 QCM II. Exercice 1 [5 points] (25 mn) Ecrire les classes, l'interface et le programme principal permettant de créer N objets distribués. N est un paramètre du programme principal. Le numéro de port de l'adaptateur est passé en paramètre. Chaque objet distribué est enregistré dans l'adaptateur sous le nom "OBJET_" + n où n est un numéro unique de 1 à N. L'objet distribué implémente la méthode distante int getNumero() qui retourne le numéro de l'objet distribué. III. Exercice 2 [5 points] (25 mn) Ecrire un programme qui crée et exécute un thread qui affiche à l'écran (println) les noms des objets distribués qui sont enregistrés dans l'adaptateur de numéro de port passé en paramètre du programme. Le thread affiche une nouvelle liste que si cette liste a changé dans le temps. Le thread s'arrête quand la liste est vide. La méthode prédéfinie String[] l = Naming.list(url); retourne la liste des objets distribués enregistré dans l'adaptateur à l'adresse URL (rmi://host:port) passé en paramètre. IV. Exercice 3 [5 points] (25 mn) Ecrire la classe Vecteur qui hérite de la classe prédéfinies Vector et qui contient la méthode void trier() et l'attribut int ordre. Cet attribut peut avoir la valeur –1 ou +1. Il permet de savoir l'ordre de tri de la méthode trier(). Si –1 alors trier par ordre décroissant, +1 par ordre croissant. La valeur de cet attribut est passé en paramètre du constructeur. Cette méthode permet de trier par ordre croissant ou décroissant les éléments du vecteur. Pour cela, vous devez créer l'interface Comparable qui déclare la méthode int comparer(Comparable o); cette méthode retourne –1 si this < o, 0 si this = o, +1 si this > o. V. Exercice 4 [5 points] (25 mn) Soit la classe suivante : public class Formulaire { public string[] motsclefs; public string[] valeurs; } Ecrire la méthode Formulaire decoder(string formulaire); qui réalise le décodage d'un formulaire quelconque provenant d'une requête http. Exemple: formulaire = "NOM=LAFONT&PRENOM=Pierre&AGE=&VILLE=Toulouse" résultats du traitements: motsclefs = ["NOM","PRENOM","AGE","VILLE"] valeurs = ["LAFONT","Pierre","","Toulouse"] page 5 Examen de Juin 2004 page 6 QCM Eléments de langage JAVA : package <p> import java.io.*; import java.lang.*; import java.net.*; import java.util.*; import java.rmi.*; import java.rmi.server.UnicastRemoteObject; import java.rmi.server.ServerNotActiveException; import java.rmi.RMISecurityManager; public class ObjetOD extends UnicastRemoteObject implements ObjetODInt public interface ObjetODInt extends Remote { <methode distante> throws RemoteException, …} Vector: v=new Vector() v.addElement(Object) Object v.elementAt(int) v.size() new public static void main(String args[]) public interface <i> Naming.rebind(String URL, <objet distribuée>) ServeurImp services; services = (ServeurImp)Naming.lookup(String URL) DataInputStream datain=new DataInputStream(System.in); System.out.print(String); String datain.readLine(); File f=new File(String [, String]) String f.getAbsolutePath() FileInputStream fi = new FileInputStream(String); DataInputStream di = new DataInputStream(fi) String di.readLine() fi.length() fi.read( byte [ ] ) fi.close() fis.read(donnees); StringTokenizer s = new StringTokenizer(String) boolean S.hasMoreTokens() String S.nextToken(); Stok.countTokens() FileInputStream fich = new FileInputStream(path+File.separator+nomFic); BufferedReader flot = new BufferedReader(new InputStreamReader(fich)); <class InputStreamReader>.readLine PrintStream os = new PrintStream(soc.getOutputStream()); Double.parseDouble; throw new <Class exception>; ServerSocket sos = new ServerSocket(9100); Socket soc = sos.accept(); byte[] donnees = new byte[ <n>]; class XXX extensThread; méthode run(); XXX x = new XXX(…); x.start(); class YYY implements Runnable; méthode run(); y = new YYY(…); Thread t = new Thread(y); t.start(); page 6