4. Eléments de langage JAVA - Exercices corriges
On veut faire communiquer en RMI l'ihm (client) et l'applicatif le serveur. Pour
cela, on crée un objet distribué dans un programme serveur qui encapsule ...
Part of the document
IPST-CNAM
Systèmes répartis
Cycle C / NFP 215
Mardi 27 Juin 2006
Sans document
Durée : 1 heures 30 minutes
Enseignants : LAFORGUE Jacques
CORRECTION de la session de JUIN NFP 215
(TRAVAUX PRATIQUES)
Exercice 1
L'applicatif est de la forme suivante :
public class AppJeu implements AppJeuInt
{
// Le constructeur propre à l'applicatif
// Implémentation de toutes les méthodes de AppJeuInt
}
L'interface AppJeuInt déclare les méthodes de l'applicatif
public interface AppJeuInt
{
// Déclaration des méthodes implémentées par AppJeu et
// devant être utilisées par l'IHM
public void exemple(.....);
}
La classe Ihm utilise un applicatif passé en paramètre sous la forme de
l'interface :
public class IhmJeu
{
AppJeuInt _app; // L'objet générique d'applicatif
// Le constructeur
public IhmJeu(AppJeuInt app, .../* les autres parametres*/...)
{
_app = app;
....
}
..... dans le code on utilise via _app les méthodes de l'applicatif
}
Ceci permet de séparer l'applicatif de l'ihm grâce à l'utilisation d'une
interface qui décrit les méthodes de l'applicatif utilisées par l'ihm.
On veut faire communiquer en RMI l'ihm (client) et l'applicatif le serveur.
Pour cela, on crée un objet distribué dans un programme serveur qui
encapsule l'applicatif :
public class AppJeuServeur
{
public static void main(String args[]) throws Exception
{
String nomRegister = ""; // Nom du registre de
l'applicatif
int port = 0; // port de
l'adaptateur utilisé
try{
nomRegister = args[0];
port =
Integer.parseInt(args[1]);
}catch(Exception e)
{System.out.println("Mauvais parametrage");
return; }
// Création du registre RMI
//
try {
LocateRegistry.createRegistry(port);
}catch(Exception e){};
// Création de l'OD de gestion du jeu
//
AppJeuOD app = new
AppJeuOD(jeu,nbLigne,nbColonne,nomRegister,port);
}
}
La classe de l'objet distribué :
public class AppJeuOD extends UnicastRemoteObject implements
AppJeuODInt
{
private AppJeu _app; // L'applicatif
encapsulé dans l'OD
private String _nomRegister; // Le nom dans le
registre de l'OD
private int _portRegister; // Le port utilisé
public AppJeuOD(JeuInt jeu,
String nomRegister,
int portRegister) throws
Exception
{
// Création de l'applicatif de jeu
_app = new AppJeu(..);
// Enregistrement de l'OD dans l'adaptateur RMI
//
_nomRegister = nomRegister;
_portRegister = portRegister;
Naming.bind("rmi://localhost:"+
portRegister+
"/"+
nomRegister,
this);
}
// ON IMPLEMENTE TOUTES LES METHODES DE L'INTERFACE DE
L'APPLICATIF
//
=================================================================
// Chaque méthode appelle les méthodes de l'applicatif
//
synchronized public int exemple(.....) throws
RemoteException
{
return _app.exemple(....);
}
.....
}
Pour transformer l'ihm en client, on crée un client qui crée l'ihm en lui
passant en paramètre un applicatif qui réalise la communication avec le
serveur :
Le programme client est :
public class IhmClient
{
public static void main(String args[]) throws Exception
{
String hostname = ""; // hostname du serveur
int port = 0; // port de l'adpaptateur
String nomAppJeu = ""; // nom de l'applicatif
de jeu =nom du registre de l'applicatif de jeu
try{
hostname = args[0];
port =
Integer.parseInt(args[1]);
nomAppJeu = args[2];
}catch(Exception e)
{
System.out.println("Mauvais parametrage: host port nomAppJeu");
return;
}
// Création de l'objet qui premet de communiquer
en RMI avec l'applicatif de jeu
//
IhmJeuRmiImp app = new
IhmJeuRmiImp(hostname,port,nomAppJeu);
// Creation de l'IHM
//
IhmJeu ihm = new IhmJeu(app,....);
// Affichage de l'IHM sur le poste client
(frame, applet, ....)
.....
}
La classe passée en paramètre de l'ihm est une "passerelle" d'appel
aux méthodes distantes de l'applicatif :
public class IhmJeuRmiImp implements AppJeuInt
{
private AppJeuODInt _app; // La référence de l'OD
distant de l'applicatif
// Constructeur
public IhmJeuRmiImp(String hostname, // Le nom de la
machine où se trouve l'OD distant
int port,
// Le numéro de port utilisé par l'OD distant
String nomAppJeu
// Nom dans le registre de l'OD
) throws Exception
{
try{
// On récupére l'amorce de
communciation RMI de l'OD
_app =
(AppJeuODInt)(Naming.lookup("rmi://" + hostname + ":" +
port +
"/"+nomAppJeu));
}catch(Exception e)
{
throw new Exception("PB
SUR LOOKUP");
}
}
// ON IMPLEMENTE TOUTES LES METHODES DE L'INTERFACE DE L'OD
QUI SONT
// CELLES DE L'INTERFACE ENTRE L'APPLICATIF ET L'IHM
//
=================================================================
// On ne fait que appeller les méthodes de l'interface en
capturant
// les exceptions liées à la communication RMI
//
=================================================================
public void exemple(......)
{
try{
return _app.exemple(....);
}catch(RemoteException e){return;}
}
Exercice 2
Fichier: Client.java
import java.awt.*;
import java.io.*;
import java.net.*;
// La classe du client qui ne fait que se connecter au serveur
// et ecrir le nom de la classe sur le socket
//
public class Client
{
static public void main(String args[]) throws Exception
{
String host = args[0];
// host du serveur
int port = Integer.parseInt(args[1]);
// port du serveur
String nomClasse = args[2];
// nom de la classe
/* Creation du socket */
Socket soc = new Socket(host,port);
// Ecriture du nom de la classe sur le socket du
serveur
PrintStream ps = new
PrintStream(soc.getOutputStream());
ps.println(nomClasse);
}
}
Fichier: Serveur.java
import java.io.*;
import java.awt.*;
import java.net.*;
// Classe interne permettant de créer un thread
// pour exécuter l'action
//
class ActionThread extends Thread
{
private ActionInt _action; // L'action a exécuter
public ActionThread(ActionInt action)
{