Session de JUIN NFP 215

publicité
Examen de Juin 2007
page 1
IPST-CNAM
Systèmes répartis
Cycle C / NFP 215
Jeudi 21 Juin 2007
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 (6 pts)
A travers la réalisation des 3 projets (projet 1, projet 2 et projet 3), nous avons vu la mise en place d'une
architecture logicielle permettant, notamment, d'illustrer les points suivants :
1. la séparation rigoureuse de l'IHM avec son applicatif
2. l'encapsulation de l'applicatif dans un objet distribué RMI (serveur)
3. la création des clients RMI dont la communication est monodirectionnel dans le sens client vers serveur
4. la portabilité de l’architecture en différentes couches de communication (RMI, CORBA, ...)
Expliquez comment chacun de ces points ont été réalisés en Java (avec RMI) et mettre en évidence les liens
d’interface, d’héritage, d’agrégation entre les composants logiciels.
A titre de rappel, les noms des classes et interface utilisés dans les corrections des TP sont :
AppSudokuServeur
IhmSudoku
IhmClient
IhmSudokuRmiImp
AppSudoku
Thread
AppSudokuInt
UnicastRemoteObject
AppSudokuOD
Remote
AppSudokuODInt
2. Exercice 2 (10 pts)
Dans le cadre du projet 2 étape 1, nous avons réalisé un client IHM et son serveur RMI.
On se propose, sur la même base d’architecture de classe, de coder que la fonctionnalité d’envoi de message
entre les deux IHM connectés au même serveur.
Je rappelle que la 1ère IHM n’envoie pas vraiment le message « Bonjour » à la 2ème IHM, mais elle demande au
serveur de mémoriser le message. Alors que dans un thread, chaque IHM demande au serveur le contenu
respectif de leurs messages.
Ecrire le code Java permettant de réaliser ce programme.
Le serveur est un objet distribué qui mémorise les messages.
Les méthodes getMessage et setMessage sont les deux seules méthodes distantes à implémenter.
page 1
Examen de Juin 2007
page 2
NFP 215 - Systèmes répartis
Afin de simplifier le programme, le numéro (0 ou 1) de chaque IHM est passé en paramètre du main du client
IHM.
Vous n’avez pas à écrire le code qui crée et affiche le frame de l’IHM. Vous pouvez partir du principe que le
Frame est passé en paramètre du constructeur de la classe d’IHM.
3. Exercice 3 (4 pts)
Ecrire le code Java qui permet de vérifier que le coup dans une grille de Sudoku est valide.
La grille et les caractéristiques de la grille sont des attributs de la classe AppSudoku.
Je rappelle qu’une grille de sudoku est soit une grille 4x4 dont chaque région est 2x2, soit une grille 9x9 dont
chaque région est 3x3.
Un coup est une coordonnée (i,j) et une valeur v (soit de 1 à 4, soit de 1 à 9, en fonction de la taille de la grille).
Un coup valide est un coup dont la valeur n’existe pas déjà dans la colonne, dans la ligne et dans la région du
coup joué.
Eléments de langage JAVA :
package <p>
import java.io.*;
import java.lang.*;
import java.net.*;
import java.util.*;
import java.awt.* ;
import java.rmi.*; import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.server.ServerNotActiveException;
import java.rmi.RMISecurityManager;
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()));
public class ObjetOD extends UnicastRemoteObject implements
ObjetODInt
public interface ObjetODInt extends Remote { <methode
distante> throws RemoteException, …}
byte[] donnees = new byte[ <n>];
class XXX extensThread; méthode run();
XXX x = new XXX(…);
x.start();
try {LocateRegistry.createRegistry(port);}catch(Exception e){};
Vector: v=new Vector()
Object v.elementAt(int)
v.addElement(Object)
v.size()
class YYY implements Runnable; méthode run();
y = new YYY(…);
Thread t = new Thread(y);
t.start();
ArrayList<String> lstr; lstr = new ArrayList();
for(String s : lstr){ ....... //s est l’élément courant }
lstr.add(s);
Class classXXX = Class.forName("cnamp."+nomPackage + "."
+ nomXXX);
XXXInt o = (XXXInt)(classXXX.newInstance());
Integer i = Integer.parseInt(newString("..."));
new
public static void main(String args[])
public interface <i>
private JTextField
Naming.rebind(String URL, <objet distribuée>)
ServeurImp services;
services = (ServeurImp)Naming.lookup(String URL)
message
message;
= new JTextField("");
class MessageAction implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
// On envoie le message
app.setMessage(numeroJoueur) ;
}
}
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()
// pour accéder et changer un texte d’IHM
String s = message.getText() ;
message.setText(s) ;
JPanel panelIHM
FileInputStream fich = new
FileInputStream(path+File.separator+nomFic);
= new JPanel(new BorderLayout());
panelIHM.add( XXX,
BorderLayout.NORTH); // SOUTH, EAST, WEST
page 2
Téléchargement