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
Afin de mieux exposer mon problème, voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: controllers.srvEcho_Stub (no security manager: RMI class loader disabled)
---- Interface Serveur
------- Class : Serveur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public interface interEcho extends Remote{ public Date echo() throws RemoteException; }
----- Class : client
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Applications
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
-le resultat obtenu en exécutant la fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 java -Djava.security.policy=controllers/mypolicy -Djava.rmi.server.codebase=file:C:/Dev/Projets/play/test-RMI_Server/tmp/classes/ controllers.srvEcho
est l’exception mentionnée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public static void affiche() { cltEcho cl = new cltEcho(); String message = cl.getInfo(); render(message); }
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
avez-vous une idée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci,
Partager