Ecole Nationale des Sciences de l’Informatique
A. U. : 2013/2014
EXAMEN
Systèmes et Applications Répartis
Classe/Filières:
Durée :
Responsables : F. Najjar & N. Ben Azzouna
II2- SLE & RSR
2h00
02/06/2014
Date:
Documents: Non autorisés
Nb. Pages: 4
Prière de lire attentivement l’énoncé.
On demande des réponses concises mais claires et précises.
Exercice1 : Questions diverses (7 points – 1,5+1+1,5+0,5 +1+1+0,5)
1) Comparez les deux mécanismes de communication RPC et RMI, en complétant la table ci-
dessous :
Plateforme
(1/multi)
Langage de
programmation
RPC
RMI
…………………… ……………………
…………………… ……………………
Utilitaire d’IDL …………………… ……………………
Protocole réseau …………………… ……………………
Serveur de
nommage
…………………… ……………………
Extra
…………………… ……………………
2) Quelle commande Unix vous permet de vérifier quels sont les services RPC disponibles sur
votre serveur. En donnez au moins deux exemples communs de services.
3) Que fait chacune des commandes suivantes :
a) rpcinfo –u localhost 53667767
b) java -Djava.security.policy=../tous.policy \
-Djava.rmi.server.codebase=http://machine.ensi.rnu.tn/ \
chat.server.RemoteServerImpl MonNomServer
1
4) On suppose donner le code suivant, représentant un objet distant:
interface RobjInt extends Remote{
public void faire();
}
public class Robj implements RobjInt
extends UnicastRemoteObject{
public void faire(){
// code …
}
}
Afin d’obtenir une référence à l’objet distant, dire quelle ligne de code vous devriez
utiliser?
a) Robj q = (Robj)Naming.Lookup(...);
b) Robj q = Naming.Lookup(...);
c) Robj q = (RobjInt)Naming.Lookup(...);
d) RobjInt q = Naming.Lookup(...);
e) RobjInt q = (RobjInt)Naming.Lookup(...);
5) On rappelle que JMS est basé sur un ensemble de concepts de messagerie. Complétez le
tableau suivant par les interfaces correspondantes :
JMS parent
Destination
Session
Modèle
Point- to-Point
……………………
Modèle
Publish-Subscribe
……………………
…………………… ……………………
MessageProducer
……………………
……………………
MessageConsumer
……………………
……………………
6) Pour un client MOM, quelle est la différence entre réception synchrone et réception
asynchrone ?
7) Expliquer la relation entre JMS, JORAM et Scalagent.
Exercice 2: RPC (6 points—1,5+0,75+0,75+1,5+1,5)
On souhaite mettre en place un service de gestion de vols aériens (départs et arrivées) dans un
aéroport permettant de :
Rajouter une ligne information (RefVol, campagnie, dest./départ, heure, etat) –int
Advertisement
AddRow(Info ligne)
Supprimer une ligne –int DeleteRow(string Ref_vol)
2
Retrouver l’heure à partir d’une référence de vol --Time FindH(string Ref_vol)
On suppose que les type string et Time sont déjà prédéfinis.
1) Ecrire deux interfaces en RPCL, l’une utilisée par les employés de l’aéroport, Tableau.x,
et l’autre par les clients/voyageurs, RTable.x, qui leur permettent une consultation.
2) Dire à quoi sert le fichier RTable_xdr.c correspondant au fichier RTable.x?
3) On ne vous demande pas d’écrire tout le serveur mais seulement de donner le prototype de la
fonction FindH dans le serveur.
4) Comment un client, placé sur un site différent du serveur, peut s’y connecter et puis faire
appel à distance de la fonction FindH(TU 21537).
5) On souhaite modifier le serveur afin qu’il puisse offrir une autre fonction, FindBox, qui
retourne le numéro de box d’enregistrement pour une destination donnée. En donnez
l’interface RTable en RPCL de ce nouveau service. Et dire comment un client peut faire
appel à la fois à FindH(TU_2137) et puis FindBox(Lyon)? Expliquez succinctement
votre solution.
Exercice 3 : Réservation de chambre à distance par RMI (7 points— 1+1+2+1+1+…)
On considère une application client/serveur de réservation de chambre d’hôtel en ligne. Le service
distant correspondant s’appelle ReservationChambre. Il offre les opérations suivantes :
int ReserverChambre(Information inf) qui permet de réserver une
chambre en se basant sur les informations encapsulées dans un objet de type
Information et rend une référence de réservation de type int. Une référence
nulle indique un échec de réservation.
boolean AnnulerReservation(int ref) qui permet d’annuler une
réservation de chambre en se basant sur sa référence passée en paramètre et qui retourne
un boolean.
Information DetailsReservation(int ref) qui rend les informations
concernant une réservation identifiée par sa référence.
Nous supposons pour toutes les classes d’implémentation le nom de la classe se termine
par Impl. Par exemple, la classe d’implémentation de ReservationChambre
s’appelle ReservationChambreImpl.
1) Quelle(s) condition(s) doit (doivent) être satisfaite(s) par les méthodes ReserverChambre
et AnnulerReservation pour y assurer un accès distant et concurrent ?(0,5 pt)
2) Ecrire l’interface correspondant à ce service.(1 pt)
3
3) L’entité Information sera implantée côté client et passée par valeur lors de l’invocation de
ReserverChambre. Quelle(s) condition(s) doit
(doivent) être
satisfaite(s) par
Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette
méthode ?(1 pt)
4) L’entité Information est actuellement passée par référence au serveur lors de l’appel de
ReserverChambre. Quelles modifications doivent être faites au niveau de l’objet
Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette
méthode ?(1 pt)
5) Parmi les choix d’implémentation faits au niveau des questions 3 et 4, quel est selon vous le
meilleur choix ? Justifier. (1 pt)
Ecrire l’implantation de Compte (CompteImpl).
6) Ecrire le code du client ReservationClient qui permet de : (1,5 pt)
Récupérer une référence sur
l’instance de
l’objet ReservationChambre
enregistrée
dans
rmiregistry
en
utilisant
l’URL
correspondante :
rmi://machineServeur/Reservation.
Créer une instance de l’objet Information qui prend 5 paramètres : le nom, le
nombre de chambres, le nombre de nuitées, le prix d’une nuitée et la date d’arrivée.
Passer
une demande de
réservation de
chambre
auprès de
l’objet
ReservationChambre distant.
Afficher la référence de réservation correspondante.
Bonne Réflexion
4
Proposition de Correction de l’Exam SAR du 02/06/2014
Exercice1 : Questions diverses (7 points – 1,5 +1+1,5+0,5+1+1+0,5)
1) Comparez les deux mécanismes de communication RPC et RMI, en complétant la table ci-dessous :
(1,5 --6 * 0,25/ligne)
Plateforme
(1/multi)
Langage de
programmation
RPC
Multi
Advertisement
RMI
Multi
C, C++, …
JAVA
Utilitaire d’IDL
rpcgen
Javac (rmic)
Protocole réseau
TCP/IP
TCP/IP, http,
IIOP
Serveur de
nommage
portmapper
Rmi(registry)
Extra
base de NFS
Rmi dynamique
0,
25
2) Quelle commande Unix vous permet de vérifier quels sont les services RPC disponibles sur
votre serveur. En donnez au - deux exemples communs de services. (1pt –0,5+2*0,25)
La commande rpcinfo –p permet de lister tous les programmes/services rpc tels
que portmap, rpcbind, NFS, …
3) Que fait chacune des commandes suivantes:
a) rpcinfo –u localhost 53667767
(0,5 pt)
Appelle la procédure 0 du programme numéro 53667767 sur la machine
localhost. Genre de ping afin de vérifier le bon fonctionnement du réseau et
que le serveur est opérationnel.
b) java -Djava.security.policy=../tous.policy \
(1 pt)
-Djava.rmi.server.codebase=http://machine.ensi.rnu.tn/ \
chat.server.RemoteServerImpl MonNomServer
5
Après lancement de rmiregistry, Lancez le Server MonNomServer en lui
indiquant quel fichier politique de sécurité (tous.policy) à utiliser et
quel est le codebase, c-à-d quel est l'URL du serveur HTTP capable de
servir les classes nécessaires pour utiliser ce serveur.
4) On suppose donner le code suivant, représentant un objet distant:
(0,5 pt)
interface RobjInt extends Remote{
public void faire();
}
public class Robj implements RobjInt
extends UnicastRemoteObject{
public void faire(){
// code …
}
}
Afin d’obtenir une référence à l’objet distant, dire quelle ligne de code vous devriez
utiliser?
a) Robj q = (Robj)Naming.Lookup(...);
b) Robj q = Naming.Lookup(...);
c) Robj q = (RobjInt)Naming.Lookup(...);
d) RobjInt q = Naming.Lookup(...);
e) RobjInt q = (RobjInt)Naming.Lookup(...);
5) On rappelle que JMS est basé sur un ensemble de concepts de messagerie. Complétez le
tableau suivant par les interfaces correspondantes :
(1 pt –4*0,25/ligne)
JMS parent
Modèle P-to-P
Modèle Pub-Sub
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicSender
MessageConsumer QueueReceiver
TopicReceiver
6) Pour un client MOM, quelle est la différence entre réception synchrone et réception
asynchrone ?
(1 pt)
Réception synchrone délivrance en mode pull ou consommation explicite
Réception asynchrone délivrance en mode push ou consom. implicite
6
7) Expliquer la relation entre JMS, JORAM et Scalagent.
(0,5 pt)
JORAM – architecture MOM distribuée de l’implémentation JMS (OD)
Advertisement
Scalagent –implémentation de JMS d’agents distribués
Exercice 2 : RPC (6 points—1,5+1+0,75+1,25+1,5)
1) Ecrire deux interfaces en RPCL, l’une utilisée par les employés de l’aéroport, Tableau.x,
et l’autre par les clients/voyageurs, RTable.x, qui leur permettent une consultation.
(1,5 pt –2*0,75)
Tableau.x
RTable.x
program RVols {
version RVol_VERS {
void VNULL (void) = 0;
Time FindH(String
Ref_vol)=1;
} = 1;
} = 0x34567891;
struct string chaine <25>
struct ligne {
chaine RefVol, campagnie;
chaine dest_dep;
Time heure,
chaine etat;
}
Typedef Info ligne ;
program GVols {
version GVols_VERS {
void VNULL (void) = 0;
int AddRow (Info)= 1;
int DeleteRow(string
Ref_vol)=2;
Time FindH(String Ref_vol)=3;
} = 1;
} = 0x23456789;
2) Dire à quoi sert le fichier RTable_xdr.c correspondant au fichier RTable.x? (0,75 pt)
RTable_xdr.c est un filtre ou une représentation des données, généré par
rpcgen sur RTable.x
3) On ne vous demande pas d’écrire tout le serveur mais seulement de donner le prototype de la
(0,75 pt)
fonction FindH dans le serveur. Expliquez brièvement.
Time FindH_1_svc(string vol, struct svc_req *rqstp)
Le post fixe indique la version (ici 1) et svc (implémentation coté serveur)
7
4) Comment un client, placé sur un site différent du serveur, peut s’y connecter et puis faire
(1,5 pt –1+0,5)
appel à distance de la fonction FindH(TU_21537).
CLIENT *clnt ;
clnt= clnt_create(server, RVols, RVols_VERS, path)?.
Connecter le client au serveur hébergeant le programme RVols de version
RVols_VERS
Time t=FindH_1(TU_2137, clnt)
5) On souhaite modifier le serveur afin qu’il puisse offrir une autre fonction, FindBox, qui
retourne le numéro de box d’enregistrement pour une destination donnée. En donnez
l’interface RTable en RPCL de ce nouveau service. Et dire comment un client peut faire
appel à la fois à FindH(TU_2137) et puis FindBox(Lyon)? Expliquez succinctement
(1,5 pt –2*0,75)
votre solution.
On rajoute dans RTable.x
program RVols {
version RVol_VERS {
void VNULL (void) = 0;
Time FindH(String Ref_vol)=1;
} = 1;
version RVol_VERS2 {
void VNULL (void) = 0;
//possible de ne pas mettre reprendre FindH
// mais ca va demander de se connecter apres 2 fois
Time FindH(String Ref_vol)=1;
Int FindBox(string name)= 2;
} = 2;
} = 0x34567891;
Ainsi, à l’appel des deux fonctions on se connecte une seule fois à version 2 ;
et dans le serveur la fonction FindH_2_svc fait appel elle-même FindH_1_svc
CLIENT *clnt ;
clnt= clnt_create(server, RVols, RVols_VERS2, path)?.
Time t=FindH_2(TU_2137, clnt) ; int nb = FindBox(Lyon) ;
8
Exercice 3 : Réservation de chambre à distance par RMI (7 points—
1+1+2+1+1)
1) Quelle(s) condition(s) doit (doivent) être satisfaite(s) par les méthodes ReserverChambre
et AnnulerReservation pour y assurer un accès distant et concurrent ?(0,5pt)
public et synchronized
2) Ecrire l’interface correspondant à ce service.(1pt)
import java.rmi.RemoteException;
import java.rmi.Remote;
public interface ReservationChambre extends Remote {
Advertisement
public int ReserverChambre(Information inf) throws RemoteException;
public boolean AnnulerReservation(int ref) throws RemoteException;
public Information DetailsReservation(int ref) throws RemoteException;
}
3) L’entité Information sera implantée côté client et passée par valeur lors de l’invocation de
ReserverChambre. Quelle(s) condition(s) doit
(doivent) être
satisfaite(s) par
Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette
méthode ?(1pt)
Etre Serializable ainsi que tous les objets qu’elle encapsule éventuellement.
ReservationChambre, ReservationChambreImpl, Information, InformationImpl
4) L’entité Information est actuellement passée par référence au serveur lors de l’appel de
ReserverChambre. Quelles modifications doivent être faites au niveau de l’objet
Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette
méthode ?(1pt)
Avoir une interface Remote et être exportée ou bien en héritant de UnicastRemoteObject ou
bien par appel de la méthode UnicastRemoteObject.exportObject(this).
ReservationChambre, ReservationChambreImpl, Information
5) Parmi les choix d’implémentation faits au niveau des questions 3 et 4, quel est selon vous le
meilleur choix ? Justifier. (1pt)
Celui de la question 3 parce que les informations concernant une réservation sont statiques
donc il vaut mieux passer une copie de ces informations et les exploiter localement : ça réduit la
charge au niveau du réseau et le temps de réponse.
6) Ecrire le code du client ReservationClient qui permet de :
9
Ecrire l’implantation de Compte (CompteImpl).
Récupérer une référence sur
l’instance de
l’objet ReservationChambre
enregistrée
dans
rmiregistry
en
utilisant
l’URL
correspondante :
rmi://machineServeur/Reservation.
Créer une instance de l’objet Information qui prend 5 paramètres : le nom, le
nombre de chambres, le nombre de nuitées, le prix d’une nuitée et la date d’arrivée.
Passer
une demande de
réservation de
chambre
auprès de
l’objet
ReservationChambre distant.
Afficher la référence de réservation correspondante.
ReservationObj
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
public class ReservationClient {
public static void main(String args[]) {
try {
// Récupération d'un stub sur l'objet serveur.
ReservationChambre
Naming.lookup("rmi://machineServeur/Reservation");
//Création et exportation d’une instance de l’objet Etudiant
Information
InformationImpl("Nom", "date",nombrechambre,nombrenuitees, prix) ;
int ref = ReservarionObj.ReserverChambre(inf);
if (ref !=0)
System.out.println("La référence de réservation est "+ref) ;
else
System.out.println("Echec de réservation") ;
inf
=
=
(ReservationChambre)
new
} catch (Exception e) {
System.out.println("ReservationClient err: " + e.getMessage()) ;
e.printStackTrace(); }
}
}
7) L’entité Information possède une méthode getdate () qui rend la date d’arrivée à
l’hôtel. Cette méthode est appelée dans ReserverChambre afin de vérifier les disponibilités.
Si on considère le choix fait dans la question 3, cette méthode sera exécutée par la JVM serveur
ou client ? Justifier.
JVM serveur puisque Information est passée par copie et l’invocation est faite localement au
niveau du serveur sur le clone.
10