5
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI
// l'interface à exporter (deux services définis)
public interface CalculRmi extends java.rmi.Remote {
public int plus(int un, int deux)
throws java.rmi.RemoteException;
public int mult(int un, int deux)
throws java.rmi.RemoteException;
}
Cas simple :
• Le client connaît le nom du serveur (« TheServer »)
• La rmiregistry est lancée sur le serveur
• Le client passe des arguments « de base » (int)
«TheServer »
Client Java
Serveur Java
rmiregistry
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI
// Client utilisant des services d’un objet-serveur distant
import java.rmi.*;
public class ClientRmi {
static public void main(String arg[])
{int i1, i2, res;
String NomHostServeur, NomObjServeur;
CalculRmi ObjServeur;
// Parse la ligne de commande
NomHostServeur = arg[0]; NomObjServeur = arg[1];
i1 = Integer.parseInt(arg[2]); i2 = Integer.parseInt(arg[3]);
try {
// Recherche de l’objet-serveur distant dans la rmiregistry
ObjServeur = (CalculRmi) Naming.lookup(
"rmi://" + NomHostServeur + "/" + NomObjServeur);
// Usage du service distant trouvé
res = ObjServeur.plus(i1, i2);
} catch (Exception e){
System.out.println("Erreur RMI " + e.getMessage());
System.exit(1);
}
System.out.println("Résultat appel RMI: " + res);
}
}
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI
// Objet-Serveur RMI (debut)
import java.util.*;
import java.rmi.*;
import java.rmi.server.*;
public class ObjServeurRmi extends UnicastRemoteObject
implements CalculRmi {
private String nomObjServeur;
public ObjServeurRmi(String s) throws RemoteException {
super();
nomObjServeur = s;
}
public String getNomObjServeur() {
return nomObjServeur;
}
// Premier service exporté
public int plus(int a, int b)throws RemoteException {
return a + b;
}
// Deuxième service exporté
public int mult(int a, int b)throws RemoteException
return a * b;
}
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI
// Objet-Serveur RMI (fin)
// Fonction main : pour le lancement du serveur
static public void main(String arg[]) {
System.setSecurityManager(new RMISecurityManager());
try {
ServeurRmi srmi = new ObjServeurRmi("Calculateur");
Naming.rebind("//localhost/Calculateur", srmi);
System.out.println("Enregistrement objet-serv OK");
} catch (Exception e) {
System.out.println("Pb enregistrement service: " +
e.getMessage());
System.exit(1);
}
}
}
Programmation par RPC
et Java-RMI :
- Principes des RPC
- Utilisation d’un IDL
- Principes des Java-RMI
- Mode opératoire des Java-RMI
- Hiérarchie de classes Java
- Exemple de client-serveur en Java-RMI
- Limitations du déploiement
Programmation par RPC et Java-RMI
Limitations du déploiement (1)
rmiregistry
Client
Skeleton ServerC ObjServeurC
Déploiement simple entre deux machines distantes :
Skeleton ServerB ObjServeurB
Skeleton ServerA ObjServeurA
rmiregistry
Skeleton ServerF ObjServeurF
Skeleton ServerE ObjServeurE
Skeleton ServerD ObjServeurD
Veut appeler
l’objet serveur
« K » … où
est-il ?
Quand le système grossit il est difficile
de savoir à quelle rmiregistry s’adresser !
Un annuaire global des services devient nécessaire !