Problème client/serveur RMI avec Play
Bonjour à tous,
Je viens de débuter avec RMI. J'ai crée dans projet Play un serveur simple qui renvoi la date actuel et un client qui l'affiche.
Quand je lance le serveur et le client depuis des lignes de commandes, j'obtiens le résultat souhaité. J'ai bien la date qui est affichée.
Cependant, quand j'essaye de récupérer cette donnée depuis une fonction de la class Applications pour l'afficher dans une page web, la méthode me renvoi cette erreur
Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: controllers.srvEcho_Stub (no security manager: RMI class loader disabled)
Afin de mieux exposer mon problème, voici mon code :
---- Interface Serveur
Code:
1 2 3 4 5 6
|
public interface interEcho extends Remote{
public Date echo() throws RemoteException;
} |
------- Class : Serveur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
public class srvEcho extends UnicastRemoteObject implements interEcho{
protected srvEcho() throws RemoteException {
super();
}
private static final long serialVersionUID = 1L;
public Date echo() throws RemoteException {
return new Date();
}
//*Pour lancer le serveur depuis le Terminal
public static void main (String arg[]){
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
srvEcho serveurEcho = new srvEcho();
Naming.rebind("srvEcho", serveurEcho);
System.out.println("Le serveur et pret");
} catch (Exception e) {
System.out.println("Erreur !! \n\n\t"+e.toString());
}
}
//*/
//* Pour lancer la serveur depuis une fonction
public static String Lancer (){
String rep = new String("Rep Serv : ");
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
srvEcho serveurEcho = new srvEcho();
Naming.rebind("srvEcho", serveurEcho);
System.out.println("Le serveur et pret");
rep += "Le serveur et pret";
} catch (Exception e) {
System.out.println("Erreur !! \n\n\t"+e.toString());
rep += "Le serveur et pret";
}
return rep;
} |
----- Class : client
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public class cltEcho {
public cltEcho(){}
public static String getInfo(){
String message = new String("Reponse :");
String urlService=new String("rmi://localhost/srvEcho");
//String urlService=new String("rmi://Dev/Projets/play/test-RMI_Server/tmp/classes/controllers/srvEcho");
interEcho serveur=null;
try{
// localisation du service
serveur=(interEcho) Naming.lookup(urlService);
// boucle de lecture des msg à envoyer au serveur d'écho
Date date = (Date) serveur.echo();
message += date;
System.out.println("la reponse est: "+date);
}
catch (Exception e){
System.err.println("Erreur : " + e);
message += "Erreur : " + e.toString();
}//try
return message;
}
} |
----- Class : Applications
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public class Application extends Controller {
public static void index() {
render();
}
public static void affiche() {
cltEcho cl = new cltEcho();
String message = cl.getInfo();
render(message);
}
} |
mes étapes d’exécution:
- je démarre mon application play
- une fois les fichiers compiler je génère le srvEcho_Stub dans le meme répertoire (tmp/classes/controllers/)
- je lance la commande rmiregistry
- je lance le serveur
Code:
1 2
|
java -Djava.security.policy=controllers/mypolicy -Djava.rmi.server.codebase=file:C:/Dev/Projets/play/test-RMI_Server/tmp/classes/ controllers.srvEcho |
-le resultat obtenu en exécutant la fonction
Code:
1 2 3 4 5 6
|
public static void affiche() {
cltEcho cl = new cltEcho();
String message = cl.getInfo();
render(message);
} |
est l’exception mentionnée.
Je note que les classes sont dans le même package controllers
et si j’exécute je client depuis une ligne de commande j'ai le bon résultat
Code:
1 2 3 4
|
C:\Dev\Projets\play\test-RMI_Server\tmp\classes>java controllers/cltMain
la reponse est: Wed Apr 11 14:56:00 CEST 2012
Reponse :Wed Apr 11 14:56:00 CEST 2012 |
avez-vous une idée ?
Merci,