Cast de Remote con RMI
yozine
Mensajes publicados
11
Fecha de registro
Estado
Miembro
-
yozine Mensajes publicados 11 Fecha de registro Estado Miembro -
yozine Mensajes publicados 11 Fecha de registro Estado Miembro -
Salut, je suis désolé d'apprendre que tu as des problèmes avec RMI et Eclipse. Voici une possible solution à ton problème de `ClassCastException` :
L'erreur que tu rencontres, `java.lang.ClassCastException: rmi.steu.server.EauImpl_Stub cannot be cast to rmi.steu.client.InterfaceEau`, survient généralement lorsque le stub de l'objet distant (dans ce cas, `EauImpl_Stub`) est référencé par deux class loaders différents. Voici quelques points à vérifier et des solutions possibles :
1. **Assurez-vous que les interfaces sont en commun** : Vérifiez que l'interface `InterfaceEau` est la même dans le client et le serveur. Cela signifie qu'elle doit être définie dans un package où les deux projets (client et serveur) peuvent l’utiliser. Si elle est définie dans le package `rmi.steu.client`, elle doit aussi y être dans le serveur.
2. **Compilation des stubs** : Assurez-vous que le stub (`EauImpl_stub.java`) est correctement généré à partir de la bonne interface distante et qu'il est compilé. Si tu as modifié l'interface, pense à régénérer le stub.
3. **Class Path** : Vérifiez que le classpath du projet client inclut le package contenant l'interface `InterfaceEau`. S'il n'est pas inclus, le client ne sera pas en mesure de reconnaître correctement le stub.
4. **Listener de sécurité** : Assurez-vous que la sécurité est configurée correctement et que les permissions nécessaires sont accordées pour que le code RMI fonctionne sans problème.
5. **Versions compatibles** : Assurez-vous que la version de Java utilisée est la même sur le client et le serveur.
Si ces étapes ne résolvent pas le problème, essaie de clarifier les chemins d'accès aux packages et à l'organisation du projet, ou sinon, partage les détails des classes impliquées pour obtenir une aide plus précise. Bon courage avec ton projet !
L'erreur que tu rencontres, `java.lang.ClassCastException: rmi.steu.server.EauImpl_Stub cannot be cast to rmi.steu.client.InterfaceEau`, survient généralement lorsque le stub de l'objet distant (dans ce cas, `EauImpl_Stub`) est référencé par deux class loaders différents. Voici quelques points à vérifier et des solutions possibles :
1. **Assurez-vous que les interfaces sont en commun** : Vérifiez que l'interface `InterfaceEau` est la même dans le client et le serveur. Cela signifie qu'elle doit être définie dans un package où les deux projets (client et serveur) peuvent l’utiliser. Si elle est définie dans le package `rmi.steu.client`, elle doit aussi y être dans le serveur.
2. **Compilation des stubs** : Assurez-vous que le stub (`EauImpl_stub.java`) est correctement généré à partir de la bonne interface distante et qu'il est compilé. Si tu as modifié l'interface, pense à régénérer le stub.
3. **Class Path** : Vérifiez que le classpath du projet client inclut le package contenant l'interface `InterfaceEau`. S'il n'est pas inclus, le client ne sera pas en mesure de reconnaître correctement le stub.
4. **Listener de sécurité** : Assurez-vous que la sécurité est configurée correctement et que les permissions nécessaires sont accordées pour que le code RMI fonctionne sans problème.
5. **Versions compatibles** : Assurez-vous que la version de Java utilisée est la même sur le client et le serveur.
Si ces étapes ne résolvent pas le problème, essaie de clarifier les chemins d'accès aux packages et à l'organisation du projet, ou sinon, partage les détails des classes impliquées pour obtenir une aide plus précise. Bon courage avec ton projet !
7 respuestas
Hola, estoy teniendo un poco de dificultades para hacer funcionar RMI con Eclipse. ¡Cualquier ayuda sería muy apreciada!
He creado dos paquetes, que corresponden al cliente y al servidor de la aplicación que quiero distribuir:
STEU_client
STEU_server
el servidor contiene:
- InterfaceEau.java (implements Remote)
- EauImp.java (extends UnicastRemoteObject)
{
//...
InterfaceEau serverEau =
(InterfaceEau) Naming.lookup(url);
//...
}
¿es esto lo que tienes?
es curioso que esté intentando convertir el stub...
¿puedes ser un poco más preciso, por favor (un pequeño trozo de código ^^)?
He creado dos paquetes, que corresponden al cliente y al servidor de la aplicación que quiero distribuir:
STEU_client
STEU_server
el servidor contiene:
- InterfaceEau.java (implements Remote)
- EauImp.java (extends UnicastRemoteObject)
{
//...
InterfaceEau serverEau =
(InterfaceEau) Naming.lookup(url);
//...
}
¿es esto lo que tienes?
es curioso que esté intentando convertir el stub...
¿puedes ser un poco más preciso, por favor (un pequeño trozo de código ^^)?
Algunos códigos para ilustrar:
En este código llamo al objeto remoto y lo castigo. Eso es lo que debería hacer normalmente..
En este código llamo al objeto remoto y lo castigo. Eso es lo que debería hacer normalmente..
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 ...
es lo que debería hacerse de manera estándar...
el problema puede venir del RMISecurityManager
o del bind, ¿qué has vinculado? una instancia de EauImp.java
efectivamente con el jdk 1.5 el esqueleto ya no está presente
el problema puede venir del RMISecurityManager
o del bind, ¿qué has vinculado? una instancia de EauImp.java
efectivamente con el jdk 1.5 el esqueleto ya no está presente
ouep voilà pour el binding, todo esto está en StartEau, estoy vinculando un objeto EauImpl :
try { java.rmi.registry.LocateRegistry.createRegistry(1099); //System.out.println("Estableciendo el Security Manager ..."); System.setSecurityManager(new java.rmi.RMISecurityManager()); } catch(Exception e) { System.out.print("Ya existe un registro RMI.\n\n"); } try { // registra el servicio Naming.bind("comunica_estado", new EauImpl()); } catch
Ya está, encontré el problema.
De hecho, es necesario que el cliente y el servidor utilicen el mismo archivo que contiene la interfaz. Aparentemente, una copia del archivo que contiene la interfaz en el proyecto del cliente no es suficiente.
La causa seguramente es una cuestión de 'classloader'. Lo ideal sería que el cliente cargue el archivo que contiene la interfaz que se encuentra en el servidor, utilizando la URL de este. Parece que se puede hacer. Así que tendré que trabajar en el 'classloader' de la 'interfaz remota'.
Todo esto para mostrar 'hola'..
De hecho, es necesario que el cliente y el servidor utilicen el mismo archivo que contiene la interfaz. Aparentemente, una copia del archivo que contiene la interfaz en el proyecto del cliente no es suficiente.
La causa seguramente es una cuestión de 'classloader'. Lo ideal sería que el cliente cargue el archivo que contiene la interfaz que se encuentra en el servidor, utilizando la URL de este. Parece que se puede hacer. Así que tendré que trabajar en el 'classloader' de la 'interfaz remota'.
Todo esto para mostrar 'hola'..
efectivamente, es a nivel del classloader donde deberás configurar todo.
Creo que hay cosas posibles de hacer con el SecurityManager.
Aquí tienes algo que podría ayudarte por otra parte:
https://docs.oracle.com/javase/tutorial/rmi/running.html
No olvides publicar el código de tu solución :)
Siempre podrá ser útil en el futuro.
Creo que hay cosas posibles de hacer con el SecurityManager.
Aquí tienes algo que podría ayudarte por otra parte:
https://docs.oracle.com/javase/tutorial/rmi/running.html
No olvides publicar el código de tu solución :)
Siempre podrá ser útil en el futuro.
De hecho, para el classloader no parece ser muy complicado, solo hay que llamar a una función, creo. Pero hay que poner las clases en un jar, eso no sé hacerlo, pero bueno, no es tan grave. Solo quería saber cómo funciona la llamada por RMI y hacerlo funcionar.
De todos modos, para resolver el problema, puse un proyecto común al proyecto cliente y al proyecto servidor en Eclipse, y funciona bien.
De todos modos, para resolver el problema, puse un proyecto común al proyecto cliente y al proyecto servidor en Eclipse, y funciona bien.