Partage
  • Partager sur Facebook
  • Partager sur Twitter

A propos de Java RMI

Problème de compilation, voire de connexion

Sujet résolu
    7 décembre 2009 à 15:38:44

    Bonjour tout le monde. ^^

    Je me suis lancé il y a peu au Java RMI, sur lequel on m'avait prévenu que j'allais nager dans son apprentissage au début... et oui j'avoue que je patauge pas mal. :o

    Bref !

    Je me suis donc informé sur le sujet, d'abord sur le site de SUN pour ce langage. J'ai donc lu le texte, du moins de ce que j'ai compris, et j'ai tenté le code. Fausse joie, erreur. Je lis et relis le tuto', toujours rien.

    Je décide donc de plus m'informer sur le sujet (et en français :-° ) sur le site Developpez.com ce qui ne m'a pas aidé à mieux trouver mon erreur.

    Pour finir je trouve un tuto' au comble de la simplicité au niveau des explications et... toujours rien.

    Enfin enfin... je suis un peu déçu car je me sens un peu con là. :euh:

    Je laisse donc des gens qui s'y connaissent déjà pour m'aider à résoudre mon problème. Soyez gentils, je suis plutôt langage structurel que orienté objet. :lol:

    Voici donc mon code de serveur :

    package test_rmi;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    public interface Serveur extends Remote
    {
        public void Afficher_Texte(String texte) throws RemoteException;
    }
    


    Mon code d'implémentation du serveur :

    package test_rmi;
    
    import java.rmi.*;
    import java.rmi.server.*;
    import java.rmi.registry.*;
    
    public class Implementation_Serveur extends UnicastRemoteObject implements Serveur
    {
        public Implementation_Serveur() throws RemoteException
        {
            super();
        }
        public void Afficher_Texte(String texte) throws RemoteException
        {
            System.out.println(texte);
        }
        public static void main(String[] args)
        {
            try
            {
                Implementation_Serveur objet = new Implementation_Serveur();
                Naming.rebind("rmi://kagura.ch/test_rmi", objet);
                System.out.println("OK !");
            }
            catch(Exception e)
            {
                System.err.println("Erreur: " + e.getMessage());
            }
        }
    }
    


    Et pour finir le code du client :

    package test_rmi;
    
    import java.rmi.*;
    
    public class Client
    {
        static int resultat;
    
        public static void main(String[] args)
        {
            try
            {
                Serveur tst_Serveur = (Serveur)Naming.lookup("rmi://kagura.ch/test_rmi");
                tst_Serveur.Afficher_Texte("Bonjour tout le monde !");
            }
            catch(Exception e)
            {
                System.err.println("Erreur: " + e.getMessage());
            }
        }
    }
    


    Jusque là ça va, plus d'erreur. Mais la même erreur récurrente me revient dès que je tente de compiler un quelconque fichier .java.

    Exception in thread "main" java.lang.NoClassDefFoundError: Client/java
    Caused by: java.lang.ClassNotFoundException: Client.java
           at java.net.URLClassLoader$1.run(Unknown Source)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(Unknown Source)
           at java.lang.ClassLoader.loadClass(Unknown Source)
           at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
           at java.lang.ClassLoader.loadClass(Unknown Source)
           at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    Could not find the main class: Client.java. Programm will exit.


    En gros, il ne trouve pas mes classes, alors que je suis bien dans le bon dossier. :o

    De plus, je dis problème de compilation, voire de connexion, car les trois tuto' que j'ai trouvés me semblent bien différents pour dire qu'ils sont censés traiter la même chose. Du coup je ne sais même pas si mon serveur fonctionnerait si la compilation jouerait.

    En dernière information, la structure de mes codes :

    Image utilisateur

    J'accepte volontiers les moindres suggestions. :)

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      8 décembre 2009 à 15:45:29

      Petit up, non abusif car une solution temporaire a été trouvée. :p

      (Temporaire car pas idéale m'enfin je fais avec pour mes tests. ^^)

      Quoi qu'il en soit, j'arrive à présent à lancer mon serveur et mon client. Cependant mon serveur ne parvient pas à créer une adresse de connexion.

      La nouvelle erreur est la suivante :

      access denied (java.net.SocketPermission kagura resolve)


      En sachant que j'essaie de créer un serveur à l'adresse "rmi://kagura/test_rmi". Plus de .ch. :p

      Merci d'avance. :-°
      • Partager sur Facebook
      • Partager sur Twitter
        18 décembre 2009 à 9:15:22

        Up pour donner la réponse à la solution.

        L'erreur est dans la partie suivante :

        Implementation_Serveur objet = new Implementation_Serveur();
        Naming.rebind("rmi://kagura.ch/test_rmi", objet);
        


        Ceci est une méthode que j'avais trouvé sur le net, mais elle date de 1999 et n'est plus utilisée. Il faut maintenant instancier un objet "Registry" et utilisation cette instance pour exécuter le "rebind".

        registry = LocateRegistry.createRegistry(1099);
        registry.rebind("test_rmi", new Implementation_Serveur());
        


        1099 étant le port par défaut et pouvant être changé si nécessaire. Du côté client, on se connecte de la manière suivante (exemple avec un serveur sur la même machine (localhost)) :

        Registry registry = LocateRegistry.getRegistry("localhost");
        prg = (Interface_Serveur) registry.lookup("test_rmi");
        


        L'instance "prg" permet ensuite d'utiliser les méthodes distantes du serveur.

        Voilà, merci quand même pour ceux qui ont tenté de me répondre sans succès s'il y en a eu. :p

        N'hésitez pas à demander plus d'informations là-dessus si ma solution ne vous aide pas encore. :-°

        Maintenant, je vais faire une autre instance, mais avec des DPS et des heals. :lol:
        • Partager sur Facebook
        • Partager sur Twitter

        A propos de Java RMI

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown