Vous êtes sur la page 1sur 36

RMI

Socket
Prenons un premier exemple, où l'on retourne une valeur Serializable: il va s'agir d'un ``Hello World'' distribué.
• Définissons d'abord l'interface de l'objet distant:
import java.rmi.*;
public interface HelloInterface extends Remote {
public String say() throws RemoteException; }

• Son unique méthode say est celle qui va afficher à l'écran du client ``Hello World‘’.
Son implémentation est:
import java.rmi.*;
import java.rmi.server.*;
public class Hello extends UnicastRemoteObject implements HelloInterface {
private String message;
public Hello(String msg) throws RemoteException
{ message = msg; }
public String say() throws RemoteException
{ return message; } }
• On peut compiler ces deux sources JAVA:
javac HelloInterface.java →HelloInterface.class
javac Hello.java → Hello.class

• Il faut maintenant créer les ``stubs'' et les ``squelettes‘’.


Le rôle des stubs et des squelettes est le suivant:
Le fournisseur de service exporte un type de référence. Lorsque le client reçoit
cette référence, RMI charge un stub qui transcrit les appels à cette référence en un appel au
fournisseur.
Ce processus de marshalling utilise la serialization (séquentialisation) des objets. Du côté du
serveur, un squelette effectue l'unmarshalling et invoque la méthode adéquate du serveur.
La création des stubs et squelette se fait par la commande rmic sur le code de
l'objet distant:
rmic Hello →Hello_Stub.class et Hello_Skel.class.
• Passons maintenant au client:
import java.rmi.*;
public class HelloClient {
public static void main(String[] argv) {
try {
HelloInterface hello = (HelloInterface) Naming.lookup (" rmi://localhost:4300/RMI");
System.out.println(hello.say());
} catch(Exception e) {
System.out.println("HelloClient exception: "+e); }
}}

• le serveur - c'est-à-dire la classe sur laquelle seront répercutées les demandes d'un client:
import java.rmi.*;
public class HelloServer {
public static void main(String[] argv) {
try {
Naming.rebind("rmi://localhost:4300/RMI",new Hello("Hello, world!"));
System.out.println("Hello Server is ready.");
} catch(Exception e) { System.out.println("Hello Server failed: "+e); } } }
• On peut maintenant compiler et démarrer le serveur en faisant bien attention au CLASSPATH (qui doit
au moins contenir . et/ou les répertoires contenant les .class nécessaires, accessibles de toutes les
machines sous NFS).

javac HelloClient.java → HelloClient.class


javac HelloServer.java → HelloServer.class

• Pour exécuter les programmes client et serveur, il faut démarrer le registre (ou serveur)

rmiregistry 4300
Puis :
java CalculServer
java CalculClient
Sans JNDI
Server.java

Avec JNDI
Jndi.propretis
java.naming.factory.initial = com.sun.jndi.rmi,registry.RegistryContextFactory
java.naming.provider.url = rmi://localhost:1099

Server.java
Context ctx = new InitialContext();
BanqueInterface bi = new BanqueImpl();
ctx.rebind(’’Banque’’, bi);
JNDI (Java Naming and Directory Interface)
CORBA
IIOP:Internet Inter-ORB Protocol
3- Compilation IDL

idlj : commande de compilation « idl »


-fall pour générer le stub et skeleton
-v pour afficher des messages pendant la compilation

Vous aimerez peut-être aussi