I. QCM [10 points] (20 minutes)

publicité
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
Téléchargement