Les Allergies
Alimentaires
Posez votre question Signaler

[JAVA]Cast de Remote avec RMI

yozine 11Messages postés 28 juin 2007Date d'inscription - Dernière réponse le 1 juil. 2007 à 10:10
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 ?
Lire la suite 

[JAVA]Cast de Remote avec RMI »

7 réponses
Réponse
+0
moins plus
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 ^^)
Ajouter un commentaire
Réponse
+0
moins plus
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..

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  ...
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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 
Ajouter un commentaire
Réponse
+0
moins plus
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'..
Ajouter un commentaire
Réponse
+0
moins plus
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:
http://java.sun.com/docs/books/tutorial/rmi/running.html


N'oublie pas de poster le code de ta solution :)
ça pourra toujours servir par la suite.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Ce document intitulé « [JAVA]Cast de Remote avec RMI » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?