Session de JUIN NFP 215

publicité
Examen de Septembre 2006
page 1
IPST-CNAM
Systèmes répartis
Cycle C / NFP 215
Mardi 12 Septembre 2006
NFP 215 - Systèmes répartis
Sans document
Durée : 1 heures 30 minutes
Enseignants : LAFORGUE Jacques
Session de JUIN NFP 215
(TRAVAUX PRATIQUES)
1. Exercice 1 (40 mn)
On se propose de créer un programme principal qui crée un objet distribué, ce dernier charge en mémoire un
agenda et implémente des méthodes distantes permettant de modifier et consulter cet agenda.
Le path complet du répertoire contenant le fichier de l'agenda est passé en paramètre du programme principal. Le
nom de l'objet distribué est également passé en paramètre du programme principal.
Le fichier d'agenda est un fichier texte structuré en ligne. Chaque ligne contient :
 un numéro unique d'identification du rendez-vous (incrément interne)
 la date du rendez-vous
 l'heure et minute de début du rendez-vous
 l'heure et minute de fin du rendez-vous
 le texte de rendez-vous (le reste de la ligne)
Le fichier est chargé en mémoire à la création de l'objet distribué.
Les méthodes distantes qu'il est possible de faire sont :
 ajouter un nouveau rendez-vous (aucune vérification n'est faite en cas de conflit avec les autres rendezvous)
 supprimer un rendez-vous en donnant le numéro unique d'identification du rendez-vous
 retourne tous les rendez-vous de l'agenda
Le programme principal crée l'adaptateur RMI dont le port est passé en paramètre.
L'interface de l'objet distribué contient les méthodes suivantes :
 void ajouterRdv( Date dateRdv,
int heureDebut, int minuteDebut,
int heureFin, int minuteFin,
String texteRdv);
 void supprimerRdv(int numeroRdv);
 Vector getRdvs();
Ecrire en JAVA, les classes nécessaires à la réalisation de cette application.
page 1
Examen de Septembre 2006
page 2
NFP 215 - Systèmes répartis
2. Exercice 2 (20 mn)
On se propose d'écrire un programme client en ligne de commande qui permet d'utiliser les méthodes distantes
de l'exercice précédent.
Ce programme prend en entrée le nom de la machine, le port de l'adaptateur et le nom de l'objet distribué.
Il permet de réaliser en boucle les quatre traitements suivants :
 affiche tous les rendez-vous de l'agenda
 ajoute un nouveau rendez-vous
 supprime un rendez-vous de l'agenda
 quitter le programme
Ecrire ce programme.
NB: Pour réaliser cet exercice vous utilisez les méthodes de l'interface de l'objet distribué définies
précédemment.
3. Exercice 3 (30 mn)
On se propose d'écrire un objet distribué, appelé un Factory, dont le rôle est de créer, à la demande, des agendas
en ligne, sur requête d'un client à travers internet (protocole HTTP). Ces agendas en ligne ne sont autres que des
objets distribués comme définis dans l'exercice 1.
La requête du client est "GET
/servlet/creerAgenda?HOST=nom_host&PORT=numero_port&NOM_AGENDA=nom_agenda"
où HOST est le nom de la machine sur lequel le Factory est exécuté, PORT est le numéro de port de l'adaptateur
utilisé, et MON_AGENDA est le nom de l'agenda à créer..
Si vous avez fait l'exercice 1, vous pouvez utiliser la classe de l'objet distribué que vous avez créé, sinon vous
pouvez utilisez la classe suivante:
class AgendaOD dont le constructeur est public AgendaOD(String nomOD, String pathStockage, String
nomFichier) où nomOD est le nom de l'objet distribué, pathStockage est le path de stockage, et nomFichier
est le nom du fichier d'agenda créé.
La requête est traitée par un serveur Http qui exécute un servlet qui appelle la méthode distante du Factory afin
de créer l'agenda.
Ecrire l'interface de cet objet distribué Factory dont la méthode unique consiste à créer un agenda.
Ecrire la classe de définition de ce Factory.
Ecrire le code du servlet correspondant :
public class CreerAgendaServlet extends MyServletAbstract
{
public void doGet(MyHttpServlet servlet)
{
/// CODE A ECRIRE
}
La classe MyHttpServlet contient la méthode String getValeur(Strint nommParam);
qui retourne la valeur d'un paramètre de la requêtte Http reçue.
page 2
Examen de Septembre 2006
page 3
NFP 215 - Systèmes répartis
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.*;
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, …}
try {LocateRegistry.createRegistry(port);}catch(Exception e){};
Vector: v=new Vector()
v.addElement(Object)
Object v.elementAt(int)
v.size()
Integer i = Integer.parseInt(newString("..."));
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
Double.parseDouble;
throw new <Class exception>;
String str = input.readLine();
ServerSocket sos = new ServerSocket(9100);
Socket soc = sos.accept(); soc.close()
PrintStream output = new PrintStream(_soc.getOutputStream());
BufferedReader input = new BufferedReader(new InputStreamReader(_soc.getInputStream()));
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();
Class classXXX = Class.forName("cnamp."+nomPackage + "." + nomXXX);
XXXInt o = (XXXInt)(classXXX.newInstance());
page 3
Téléchargement