[JAVA]Cast de Remote avec RMI
yozine
Messages postés
11
Statut
Membre
-
yozine Messages postés 11 Statut Membre -
yozine Messages postés 11 Statut Membre -
Salut, je galère un peu pour faire tourner RMI avec Eclipse. Un peu d'aide serait grandement appréciée !
J'ai créé deux packages, qui correspondent au client et au serveur de l'appli que je veux distribuer :
STEU_client
STEU_server
le serveur contient:
- InterfaceEau.java (interface distante)
- EauImp.java (etend UnicastRemoteObject)
- StartEau.java (lance le registre et enregistre le service de EauImpl)
- EauImp_stub.java (est généré par rmic)
+ d'autres classes pas utiles ici
Client contient:
- InterfaceEau.java (interface distante)
- TestRMI.java (client qui appelle la souche RMI)
+ ...
Je génère le stub côté serveur (visiblement avec JRMP 1.2 il n'y a plus de skel côté client)
Je met en place un security manager RMI cote client et serveur.
Je lance mon registre RMI sur le port 'localhost:1099', et j'enregistre le service distant avec 'bind'. Jusque là, pas de soucis.
Puis j'appelle le service enregistré, avec un client par 'lookup'.
Je caste l'objet Remote renvoyé par le nom de mon interface distante.
Et là j'ai ..
.. l'erreur en question :"... java.lang.ClassCastException: rmi.steu.server.EauImpl_Stub cannot be cast to rmi.steu.client.InterfaceEau ..."
Quelqu'un a une idée ?
J'ai créé deux packages, qui correspondent au client et au serveur de l'appli que je veux distribuer :
STEU_client
STEU_server
le serveur contient:
- InterfaceEau.java (interface distante)
- EauImp.java (etend UnicastRemoteObject)
- StartEau.java (lance le registre et enregistre le service de EauImpl)
- EauImp_stub.java (est généré par rmic)
+ d'autres classes pas utiles ici
Client contient:
- InterfaceEau.java (interface distante)
- TestRMI.java (client qui appelle la souche RMI)
+ ...
Je génère le stub côté serveur (visiblement avec JRMP 1.2 il n'y a plus de skel côté client)
Je met en place un security manager RMI cote client et serveur.
Je lance mon registre RMI sur le port 'localhost:1099', et j'enregistre le service distant avec 'bind'. Jusque là, pas de soucis.
Puis j'appelle le service enregistré, avec un client par 'lookup'.
Je caste l'objet Remote renvoyé par le nom de mon interface distante.
Et là j'ai ..
.. l'erreur en question :"... java.lang.ClassCastException: rmi.steu.server.EauImpl_Stub cannot be cast to rmi.steu.client.InterfaceEau ..."
Quelqu'un a une idée ?
A voir également:
- [JAVA]Cast de Remote avec RMI
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Caster avec vlc - Guide
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
7 réponses
Salut, je galère un peu pour faire tourner RMI avec Eclipse. Un peu d'aide serait grandement appréciée !
J'ai créé deux packages, qui correspondent au client et au serveur de l'appli que je veux distribuer :
STEU_client
STEU_server
le serveur contient:
- InterfaceEau.java (implements Remote)
- EauImp.java (extends UnicastRemoteObject)
{
//...
InterfaceEau serverEau =
(InterfaceEau) Naming.lookup(url);
//...
}
c'est ce que tu as?
c'est marrant qu'il essaye de caster le stub...
tu peux être un plus précis s'il te plaît (un petit bout de code ^^)
J'ai créé deux packages, qui correspondent au client et au serveur de l'appli que je veux distribuer :
STEU_client
STEU_server
le serveur contient:
- InterfaceEau.java (implements Remote)
- EauImp.java (extends UnicastRemoteObject)
{
//...
InterfaceEau serverEau =
(InterfaceEau) Naming.lookup(url);
//...
}
c'est ce que tu as?
c'est marrant qu'il essaye de caster le stub...
tu peux être un plus précis s'il te plaît (un petit bout de code ^^)
Allez un peu de code pour illustrer:
Dans ce code j'appelle l'objet distant, et il le caste. C'est ce qu'il devrait faire normalement..
Dans ce code j'appelle l'objet distant, et il le caste. C'est ce qu'il devrait faire normalement..
package rmi.steu.client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class TestRMI extends UnicastRemoteObject {
private InterfaceEau init;
private String retourRMI;
public TestRMI() throws RemoteException {
try {
System.setSecurityManager(new RMISecurityManager());
init = (InterfaceEau) Naming.lookup("rmi://localhost:1099/communique_etat");
retourRMI = init.getBonjour();
System.out.print(retourRMI);
} catch ...
c'est ce qui devrait être fait en standart...
le soucis vient peut être du RMISecurityManager
ou du bind, qu'à tu bindé? une instance de EauImp.java
effectivement avec le jdk 1.5 le skeletton n'est plus présent
le soucis vient peut être du RMISecurityManager
ou du bind, qu'à tu bindé? une instance de EauImp.java
effectivement avec le jdk 1.5 le skeletton n'est plus présent
ouep voila pour le binding, tout ca c'est dans StartEau, je binde un objet EauImpl :
try {
java.rmi.registry.LocateRegistry.createRegistry(1099);
//System.out.println("Mise en place du Security Manager ...");
System.setSecurityManager(new java.rmi.RMISecurityManager());
} catch(Exception e) {
System.out.print("Un registre RMI est déjà existant.\n\n");
}
try { // enregistre le service
Naming.bind("communique_etat", new EauImpl());
} catch
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ca y est, j'ai trouvé le problème.
En fait il faut que le client et le serveur utilisent le même fichier contenant l'interface. Visiblement une copie du fichier contenant l'interface dans le projet client ne suffit pas.
La cause est surement une histoire de 'classloader'. Le top serait que le client loade le fichier contenant l'interface qui se trouve sur le serveur, en utilisant l'url de celui-ci. Il parait que ca se fait. Donc va falloir que je bosse sur le 'classloader' de 'l'interface distante'.
Tout ca pour afficher 'hello'..
En fait il faut que le client et le serveur utilisent le même fichier contenant l'interface. Visiblement une copie du fichier contenant l'interface dans le projet client ne suffit pas.
La cause est surement une histoire de 'classloader'. Le top serait que le client loade le fichier contenant l'interface qui se trouve sur le serveur, en utilisant l'url de celui-ci. Il parait que ca se fait. Donc va falloir que je bosse sur le 'classloader' de 'l'interface distante'.
Tout ca pour afficher 'hello'..
effectivement c'est au niveau du classloader que tu va devoir tout paramétré.
Je crois qu'il y a des choses possibles à faire avec le SecurityManager.
voilà qui pourrait t'aider d'autre part:
https://docs.oracle.com/javase/tutorial/rmi/running.html
N'oublie pas de poster le code de ta solution :)
ça pourra toujours servir par la suite.
Je crois qu'il y a des choses possibles à faire avec le SecurityManager.
voilà qui pourrait t'aider d'autre part:
https://docs.oracle.com/javase/tutorial/rmi/running.html
N'oublie pas de poster le code de ta solution :)
ça pourra toujours servir par la suite.
en fait pour le classloader ca a pas l'air trop complique il y a juste une fonction a appeler je crois, mais faut mettre les classes dans un jar, je crois, ca je sais pas faire, mais bon c pas trop grave.. Je voulais juste savoir comment marche L'appel par RMI, et le faire tourner.
Sinon pour resoudre le truc, j'ai mis un projet commun au projet client et au projet serveur sous Eclipse, et ca marche bien.
Sinon pour resoudre le truc, j'ai mis un projet commun au projet client et au projet serveur sous Eclipse, et ca marche bien.