RMI RMI 2012-2013 REMOTE METHOD INVOCATION BOUAZZA Zakaria BENZERHOUN Soufiane [email protected] [email protected]
RMIRMI
2012-2013
REMOTE METHOD
INVOCATION
BOUAZZA ZakariaBENZERHOUN Soufiane
[email protected]@gmail.com
Plan
• Introduction à RMIIntroduction à RMI
• Mise en œuvre de RMIMise en œuvre de RMI
- Partie Commune (Remote - Partie Commune (Remote Interface).Interface).
- Partie Serveur (Remote Object).- Partie Serveur (Remote Object).
- Partie Cliente.- Partie Cliente.
• Sécurité?Sécurité?
• Exemple d’applicationExemple d’application
RMI? C’est Quoi?
• RMI : Remote Method InvocationDepuis Java 1.1
• Cet API propose :– GC distribué.– Même syntaxe d’utilisation pour un objet distant
qu’un objet local.– Gestion de l’objet à travers une interfaceinterface.– Liaison avec les couches transport et l'ouverture de
sockets appropriés.
Schéma illustratif
Rôle des talons
Mise en Oeuvre
Partie CommunePartie Commune ___________________________________
(le REMOTE INTERFACEREMOTE INTERFACE)
Remote Interface
• Structure de cette interface:* Hériter de java.rmi.Remote et
* Les méthodes lèvent unejava.rmi.RemoteException exception.
____________Passage d’objets en paramètre?• Les objets locaux sont passés par valeur (Shallow Copy)
– Etre sérialisables (étendent l’interface java.io.Serializable)
• Les objets distants sont passés par référence et sont désignés par leur interface (Deep Copy)
• Exemple :
Import java.rmi.Remote
Import java.rmi.RemoteException
public interface Hello implements Remote{
void sayHello() throws RemoteException;
}
Remote Interface
Partie
Serveur
Mise en Oeuvre
Partie Serveur
La Classe distante (Remote Object) :
• Implémenter l’interface distante(Hello).
• Etendre la classe
java.rmi.server.UnicastRemoteObject
• Appel Local Possible de méthodes.
Remote Object
Exemple:Public class HelloImpl extends UnicastRemoteObject
implements Hello{Public void sayHello(){System.out.println(« Hello World »);}
}
Public class HelloImpl extends UnicastRemoteObject implements Hello{
public void HelloImpl throws RemoteException{super();}
Public void sayHello() throws RemoteException{System.out.println(« Hello World »);}
//Autres méthodes locales possibles}
Une classe pour lançer le serveur:• Créer et installer le gestionnaire de Créer et installer le gestionnaire de
sécurité [Optionnel]sécurité [Optionnel]
• Créer au moins une instance de la Créer au moins une instance de la classe serveur ( HelloImpl )classe serveur ( HelloImpl )
• Enregistrer au moins une instance Enregistrer au moins une instance dans le serveur de noms (RmiRegistry)dans le serveur de noms (RmiRegistry)
Partie Serveur
RmiRegistry
Lier le stub d’un objet distant à des nomsLier le stub d’un objet distant à des noms
Objectif:
HelloImpl
Rmic pour générer le stub. pour générer le stub. peut être omis depuis peut être omis depuis
la version 5la version 5
Start rmiRegistry
Lancer le Serveur
• Instancier l’objet (HelloImpl)
• L’enregistrer dans le RmiRegistry
HelloImpl obj=new HelloImpl();
Naming.rebind(« rmi://host:port/name »,obj);
Lancer le Serveur
try {
HelloImpl obj = new HelloImpl();
Naming.rebind("rmi://localhost/he", obj);
System.out.println("Serveur lancé");
} catch (RemoteException e) …..
La classe qui lance le serveur :try {HelloImpl obj = new HelloImpl();Naming.rebind("rmi://localhost/he", obj);System.out.println("Serveur lancé");} catch (RemoteException e) …..
Client
Client
• Obtenir la référence vers l’objet désiré
Avec Naming.lookup("rmi://localhost/he");
Retourne un Remote => Hello
• Appeler méthodes
Hello p=(Hello) Naming.lookup("rmi://localhost/he");
p.sayHello();
Hello p=(Hello) Naming.lookup("rmi://localhost/he");p.sayHello();
Sécurité?
• Pourquoi en parler?
System.setSecurityManager(new RMISecurityManager());
Un policy file:grant
{
permission java.net.SocketPermission
"*:80", "connect";
};
grant{permission java.net.SocketPermission "*:80", "connect";};
java -Djava.security.policy=policyfilename
Faisons le point.
Compatibilité? Java uniquement. Contrairement à CORBA.
Charger des classes? Oui, en spécifiant le codebase.
Lenteur? Coûts de la sérialisation des paramètres…
Charger des classes distantes? Oui.