IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Problème RMI.


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 2
    Par défaut Problème RMI.
    Bonjour,

    Je fais un petit programme utilisant le RMI. Je crée mon serveur qui implémente une interface je me suis basé sur le turorial de sun. Mais j'ai des exceptions du type ClassNotFound, il y a dans la FAQ des éléments de réponse mais je ne suis arrivé à rien, apparemment c'est un problème de classpath mais je n'y connais pas beaucoup (pour ne pas dire pas du tout).

    import java.io.IOException;
    import java.io.Serializable;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;

    public class Serveur implements InterfaceExec {

    private ListePeople personne = new ListePeople();
    private static int PORT = 65533;

    public Serveur () throws RemoteException {}

    public static void main(String[] args) {

    try {
    Serveur serveur = new Serveur();
    InterfaceExec stub = (InterfaceExec) UnicastRemoteObject.exportObject(serveur, 0);

    Registry registry = LocateRegistry.getRegistry();
    System.out.println("salut3");
    registry.bind("Hello", stub); // Là il plante.

    System.out.println("Serveur bindé");

    } catch (Exception e) {
    System.err.println("Serveur exception: " +
    e.getMessage());
    e.printStackTrace(); // track
    }
    }
    }

    J'ai enlevé les méthodes de l'InterfaceExec qui sont implémentées car ce n'est pas où réside le problème.


    L'interface :

    import java.net.InetAddress;
    import java.rmi.Remote;
    import java.rmi.RemoteException;

    public interface InterfaceExec extends Remote {
    Object donneListe() throws RemoteException ;
    Object recherche(String date, String nom, String mot) throws RemoteException;
    int addLogin(InetAddress Ip, String log) throws RemoteException;
    void delLogin (int indice) throws RemoteException;
    void talkTo (Echange echange) throws RemoteException;
    void addSomeone (Echange echange) throws RemoteException;
    }

    J'obtiens au lancement du serveur (je lance bien le rmiregistry avant en spécifiant 1099 comme port).
    Je travaille avec la jdk 1.5 donc je n'ai pas à faire de rmic.


    salut3
    Serveur exception: RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: InterfaceExec
    java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: InterfaceExec
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
    at sun.rmi.transport.Transport$1.run(Transport.java:153)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
    at java.lang.Thread.run(Thread.java:595)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
    at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
    at Serveur.main(Serveur.java:67)
    Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: InterfaceExec
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
    at sun.rmi.transport.Transport$1.run(Transport.java:153)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
    at java.lang.Thread.run(Thread.java:595)
    Caused by: java.lang.ClassNotFoundException: InterfaceExec
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:242)
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:707)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:651)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:588)
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
    at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1494)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
    ... 9 more

    Je ne comprends pas pourquoi j'ai ce problème car je fais pareil que dans le tutorial de sun pour le RMI qui de toute manière me renvoit le même type d'exception alos que ce tutorial marche sur d'autres PCs mais toujouts pas mon programme.

    Merci d'avance pour vos explications

    Ramyn

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    InterfaceExec n'est pas dans ton classpath.
    Il faut donc mettre le répertoire où il y a le .class dans le classpath ou bien mettre le .jar dans lequel tu as mis ce .class dans le classpath

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 2
    Par défaut
    J'utilise Eclipse pour programmer donc à priori (et c'est vrai) tous mes .java et tous mes .class sont dans le même répertoire. Y'a bien un fichier .classpath dans mon répertoire projet et y'a ceci dedans :

    <?xml version="1.0" encoding="UTF-8"?>
    <classpath>
    <classpathentry kind="src" path=""/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre1.5.0_05"/>
    <classpathentry kind="lib" path="swing-layout-1.0.jar"/>
    <classpathentry kind="output" path=""/>
    </classpath>

    Le swing layout c'est parce que j'ai utilisé netbeans pour faire mon IHM :) .

    Merci.

    Ramyn

  4. #4
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Rien à voir avec Swing.
    Ben, j'ai essayé ton code et effectivement, j'ai le même problème.
    Je n'ai pas fait de RMI en 1.5 donc je ne sais pas s'il y a qq chose de particulier avec cette version. A priori non vue la doc qui n'a pas beaucoup changé (sauf la génération dynamique des stub).
    D'ailleurs, j'ai fait une compilation RMIC et j'ai aussi un problème de classnotfound sur le Serveur_Stub.
    ça plante aussi si on met toutes les classes dans un .jar référencé dans le classpath.
    J'en suis donc au même point que toi pour l'instant

  5. #5
    Membre éprouvé
    Inscrit en
    Mai 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 103
    Par défaut
    elle est ou la registry RMI ? dans un autre process JVM ou tu la démarres dans ton appli ? si c'est dans un autre , il faut que ta registry puisse aussi acceder aux classes que tu bind.
    Je sais pas dans java5 mais avant tu pouvais demarrer la registry dans ton code comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Registry registry=null;
            int port = 1099;
            registry = LocateRegistry.createRegistry(port);
            registry.rebind( "MonService", instanceDeMonService );
    dans ce cas, tu es sur que la registry RMI accede au class que tu veux utiliser remote.

    Ensuite, dans la partie cliente, il faut avoir les classes clientes de tes interfaces RMI.

  6. #6
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    je me suis posé cette question sur l'accès aux classes par la registry sans faire le test.
    Ta remarque m'a relancé sur le sujet et effectivement, en mettant dans le classpath de rmiregistry les .class du "serveur", on n'a plus de problème lors du bind.
    C'est donc bien la solution !
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Help probléme RMI
    Par redknight dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/03/2011, 15h20
  2. Problème RMI sous OVH (Linux)
    Par Koko22 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 26/06/2010, 17h11
  3. probléme & rmi
    Par clio671 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 27/03/2008, 22h21
  4. Problème RMI, création _Skel.class
    Par ikeaboy dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 29/05/2006, 23h04
  5. Problème RMI
    Par tralloc dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 02/03/2006, 22h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo