Rechercher : dans
Par :

[JAVA]Cast de Remote avec RMI

Dernière réponse le 1 jui 2007 à 10:10:44 yozine, le 28 jun 2007 à 10:34:39 
 Signaler ce message aux modérateurs

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 ?

Configuration: Windows XP
Firefox 1.0.4

Meilleures réponses pour « [JAVA]Cast de Remote avec RMI » dans :
2 bons livres pour Java et C++ VoirPour ce qui est de l'api java, pas besoin d'aller chercher loin, le site de sun. Néanmoins, voici un bon livre "Thinking in java" de Bruce Eckels, c'est le meilleur de tout ce que j'ai lu sur java et je le conseille vivement. Auparavant, il avait...
[mythe] JavaScript c'est la même chose que Java Voirmythe Javascript est le même langage que Java Réalité FAUX Explications Ces deux langages existent bien, et ce sont tous les deux des langages de programmation (moins poussée pour le JavaScript), mais ce ne sont pas les mêmes...
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
Télécharger Java Runtime Environment VoirJava Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des personnes dans le monde entier, de calculer les intérêts de votre prêt immobilier ou de visualiser des images en 3D. Ces...
Introduction à RMI (Remote Method Invocation) VoirIntroduction à RMI RMI (Remote Method Invocation) est une API Java permettant de manipuler des objets distants (c'est-à-dire un objet instancié sur une autre machine virtuelle, éventuellement sur une autre machine du réseau) de manière...
Architecture de RMI (Remote Method Invocation) VoirArchitecture de RMI L'architecture de RMI est schématisée ci-dessous : Lorsqu'un objet instancié sur une machine cliente désire accèder à des méthodes d'un objet distant, il effectue les opérations suivantes : il localise l'objet distant grâce...
Les classes Java VoirLa notion d'objet Le langage Java intègre fortement le concept objet, il s'agit donc d'un langage orienté objet (LOO). Le terme langage orienté objet est plus qu'une simple appellation de plus pour désigner un type de langage, il...

1

tibo, le 28 jun 2007 à 10:42:12

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 ^^)

Répondre à tibo

2

yozine, le 28 jun 2007 à 10:53:14

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  ...

Répondre à yozine

3

tibo, le 28 jun 2007 à 11:40:08

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

Répondre à tibo

4

yozine, le 28 jun 2007 à 18:15:08

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 

Répondre à yozine

5

yozine, le 28 jun 2007 à 22:18:02

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'..

Répondre à yozine

6

tibo, le 29 jun 2007 à 09:50:41

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.

Répondre à tibo

7

 yozine, le 1 jui 2007 à 10:10:44

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.

Répondre à yozine