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 :

Question RMI java


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut Question RMI java
    Salut,

    J'ai une question un peu bête héhé

    J'ai développé une application client/serveur avec les RMI, j'ai codé ça sous un même projet avec Deux packages différents, et ça fonctionne sans problème en local.

    Mon soucis est le suivant, j'ai voulu créer deux , jar un client et un serveur mais le soucis avec les RMI c'est que sur le client j'ai besoin de récupérer l'interface qui se trouve sur le serveur comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serveur.Interface myInt = ( Serveur.Interface ) Naming.lookup( serverObjectName );
    Serveur étant le packages serveur et interface le nom de l'interface sur le serveur.

    Mais comment je peux faire si j'ai deux .jar pour pouvoir caster mon lookup avec l'interface qui se trouve sur le serveur, donc sur l'autre .jar.

    J'ai essayé d'inclure le jar en tant que lib, ça marche mais le client/serveur ne peuvent fonctionner que sur la même machine.

    Comment on fait c'est assez bizarre

    merci

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    avec RMI, il faut que le client connaisse l'interface de l'objet distant.

    Le plus simple c'est de créer un .jar qui ne contient QUE les interfaces des objets distants. Ce .jar doit etre présent sur la machine client et sur le serveur.

    Pour synchroniser les 2 .jar, tu peux par exemple telecharger (via ftp,http) le .jar depuis le serveur sur le client avant de lancer ton appli.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    J'arrive pas ça m'énerve

    J'ai regroupé mes fichiers j'ai ça :

    Package client :
    client_start


    Package serveur :
    Serveur_Start
    SessionImpl => Implémente l'interface


    Package Inter :
    Interface => Interface utilisée par le client et le serveur

    J'ai ajouté SessionImpl_stub.class dans les class du package client.

    J'ai essayé de créer 2 .jar de tout cela, un avec la Main de client et l'autre de serveur. Ca marche sur le même PC mais c'est tout c'est pénible, c'est vraiment du temps perdu bêtement

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Avec Java 5, tu n'as plus besoin de creer le stub avec rmic. Le compilateur javac s'occupe de tout.

    Un exemple complet est dispo chez sun.

    Es-tu sur que ce n'est pas un probleme de sécurité (fichier jre/lib/security/java.policy) ?

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Eh bien j'utilise le jdk 1.6 donc c'est aussi bien de ne pas avoir à compiler les stub à la main.

    Pour la sécurité j'ai essayé de rajouter les lignes de security manager mais j'ai une erreur, il me dit :

    Exception in thread "Thread-0" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)

    Après pour la sécurité je ne sais pas trop, que faudrait-il faire ?

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Au vu de l'erreur, il faut que tu autorises les connexions socket a l'adresse 127.0.0.1 sur le port1099

    Plus serieusement, dans ton fichier java.policy, essaye ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    grant { 
    	permission java.net.SocketPermission "*:80-65535","connect,accept,listen,resolve";
            permission java.security.AllPermission;
    };
    si ca marche, il faudra affiner les permissions pour etre un peu moins... permissif.

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par pseudocode
    Au vu de l'erreur, il faut que tu autorises les connexions socket a l'adresse 127.0.0.1 sur le port1099

    Plus serieusement, dans ton fichier java.policy, essaye ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    grant { 
    	permission java.net.SocketPermission "*:80-65535","connect,accept,listen,resolve";
            permission java.security.AllPermission;
    };
    si ca marche, il faudra affiner les permissions pour etre un peu moins... permissif.
    Tu m'étonnes


    Bon alors ça marche pas ouééééééééééé

    Bon alors je récapitule, j'ai deux jar :

    - Un avec mon Package serveur et le Package de l'interface implémenté par le serveur

    -Un avec mon Package Client et le Package de l'interface implémenté par le serveur et aussi le stub du fichier java coté serveur qui implémente l'interface.

    Et un fichier policy.all qui contient les droits.

    Je lance le serveur : java -jar -Djava.security.policy=policy.all Serveur.jar sur ma machine
    et le client : java -jar -Djava.security.policy=policy.all Client.jar sur une autre machine.

    Le client effectue ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    try {                  
                 System.setSecurityManager(new RMISecurityManager()); 
                 System.out.println("Démarrage Thread Client ");
                  Inter.Interface myInt = ( Inter.Interface ) Naming.lookup( serverObjectName );
                  System.out.println("Client connecté");
                   myInt.Connec();
     
                   if(Stat == 0) Admin=new Client_Admin(myInt);
                   else User=new Client_simple(myInt,Nom);
     
                    } catch (RemoteException ex) {JOptionPane.showMessageDialog(null, "Erreur réseau", "Erreur",JOptionPane.WARNING_MESSAGE);
                        System.exit(0);
                    } catch (MalformedURLException ex) {JOptionPane.showMessageDialog(null, "L'adresse est mal formée !!", "Erreur",JOptionPane.WARNING_MESSAGE);
                        System.exit(0);
                    } catch (NotBoundException ex) {JOptionPane.showMessageDialog(null, "Erreur", "Erreur",JOptionPane.WARNING_MESSAGE);
                        System.exit(0);
                    }
    Et il va jusqu'à "client connecté" et puis il m'affiche "erreur réseau", donc il lève une RemoteException il bloque sur myInt.connect().

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par denebj
    Et il va jusqu'à "client connecté" et puis il m'affiche "erreur réseau", donc il lève une RemoteException il bloque sur myInt.connect().
    Deja il a passé le Naming.lookup() ce qui est le plus compliqué .

    Maintenant ca serait bien que tu donnes la trace de la RemoteException (ex.printStackTrace() et ex.getCause().printStackTrace()), parceque "erreur réseau" c'est un peu light

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Oui c'est sur c'est un peu juste

    J'ai mis en pièce jointe l'erreur, je comprends pas pourquoi il essai de ce connecter à cette adresse
    Images attachées Images attachées  

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par denebj
    je comprends pas pourquoi il essai de ce connecter à cette adresse
    Et moi donc...

    Comment tu initialise la variable "serverObjectName" coté client ?
    Et comment tu as fait le Naming.rebind coté serveur ?

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Bon alors cette adresse, quand je suis sur la même machine elle fonctionne correctement (comme 127.0.0.1)

    Coté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     public void client(String NomServ,int statut,String Name) 
    	{	                     
                Stat=statut;
                Nom =Name;
     
                try
                  {
                          adressServ=InetAddress.getByName (NomServ);
                          serverObjectName = "rmi:/"+adressServ+"/Interface";     
                     }
     
                         this.start();
                        }
                        catch (IOException e){JOptionPane.showMessageDialog(null, "L'adresse n'est pas reconnue !!", "Erreur",JOptionPane.WARNING_MESSAGE);
                        System.exit(0);}
     
    	}
    Coté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      try  {
     
        java.rmi.registry.LocateRegistry.createRegistry(1099);
        System.setSecurityManager(new RMISecurityManager());  
        SessionImpl Impl = new SessionImpl(Serv.getLog());
        InetAddress adressServ=InetAddress.getByName ("localhost");
        String serverObjectName = "rmi://"+adressServ.toString().substring(10)+"/Interface"; 
        Naming.rebind( serverObjectName,Impl);
     
       } catch (RemoteException ex) {ex.printStackTrace();
       } catch (java.net.UnknownHostException e){e.printStackTrace();
       } catch (MalformedURLException ex) {ex.printStackTrace();} 
    }
    Il n'y a qu'un / coté client parce que quand je récupére avec GetByName il me renvoi :"/..."

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par denebj
    Bon alors cette adresse, quand je suis sur la même machine elle fonctionne correctement (comme 127.0.0.1)
    Ah. Ca veut dire que lorsque ton "client" est sur un autre PC il arrive a se connecter a la registry (car le lookup fonctionne) mais qu'il ne peut pas effecuter l'appel...

    C'est louche. On dirait un pb de résolution de nom coté serveur. Essaye de lancer ton serveur par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    java -jar 
     -Djava.security.policy=policy.all 
     -Djava.rmi.server.hostname=LENOMDUSERVEUR
     Serveur.jar
    D'ailleur tu peux faire pareil coté client, et te debarasser de la construction de serverObjectName (cf tutorial de sun, donné precedement)

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par pseudocode
    Ah. Ca veut dire que lorsque ton "client" est sur un autre PC il arrive a se connecter a la registry (car le lookup fonctionne) mais qu'il ne peut pas effecuter l'appel...

    C'est louche. On dirait un pb de résolution de nom coté serveur. Essaye de lancer ton serveur par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    java -jar 
     -Djava.security.policy=policy.all 
     -Djava.rmi.server.hostname=LENOMDUSERVEUR
     Serveur.jar
    D'ailleur tu peux faire pareil coté client, et te debarasser de la construction de serverObjectName (cf tutorial de sun, donné precedement)

    Je viens juste de tester ça :
    java -jar
    -Djava.security.policy=policy.all
    -Djava.rmi.server.hostname=LENOMDUSERVEUR
    Serveur.jar

    en recherchant sur developpez.net !!! Ca marche ... Je ne comprends pas bien pourquoi je dois spécifier l'adresse IP de la machine serveur .

  14. #14
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par denebj
    Je viens juste de tester ça :
    java -jar
    -Djava.security.policy=policy.all
    -Djava.rmi.server.hostname=LENOMDUSERVEUR
    Serveur.jar

    en recherchant sur developpez.net !!! Ca marche ... Je ne comprends pas bien pourquoi je dois spécifier l'adresse IP de la machine serveur.
    Parceque, sous windows, l'adresse de "localhost" est 127.0.0.1 (loopback).
    C'est ecrit en dur dans c:\windows\system32\drivers\etc\hosts.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // retourne 127.0.0.1 sous windows
    InetAddress addressServ=InetAddress.getByName("localhost");

    A la place tu dois récupérer l'adresse IP associée a ton nom d'ordinateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InetAddress addressServ=InetAddress.getLocalHost();
    En spécifiant la propriété "java.rmi.server.hostname", Java ignore le nom/adresse du serveur que tu spécifies lors du Naming.rebind et utilise celui de la propriété.

  15. #15
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par pseudocode
    Parceque, sous windows, l'adresse de "localhost" est 127.0.0.1 (loopback).
    C'est ecrit en dur dans c:\windows\system32\drivers\etc\hosts.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // retourne 127.0.0.1 sous windows
    InetAddress addressServ=InetAddress.getByName("localhost");

    A la place tu dois récupérer l'adresse IP associée a ton nom d'ordinateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InetAddress addressServ=InetAddress.getLocalHost();
    En spécifiant la propriété "java.rmi.server.hostname", Java ignore le nom/adresse du serveur que tu spécifies lors du Naming.rebind et utilise celui de la propriété.

    Oué je pensais que c'était ça aussi, j'avais modifié et je pensais que ça marche (j'avais édité mon précédent) mais j'ai réessayé et cela ne change rien, bizarre, le serveur me donne bien 176.6.16.166 mais j'arrive pas à me connecter dessus bizarre ...

  16. #16
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    On a deja rencontré ce genre de pb sur ce forum.

    La solution finale a été de lancer le serveur comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    java -jar 
     -Djava.security.policy=policy.all 
     -Djava.rmi.server.hostname=LENOMDUSERVEUR
     Serveur.jar

Discussions similaires

  1. [Framework] [RMI] java.rmi.UnmarshalException
    Par YokoSop dans le forum Spring
    Réponses: 12
    Dernier message: 08/12/2010, 15h29
  2. Question endianness Java/C++ embarqué
    Par adn013 dans le forum Langage
    Réponses: 7
    Dernier message: 06/06/2007, 17h47
  3. RMI java.lang.NoClassDefFoundError: DataSetData
    Par wissam dans le forum JBuilder
    Réponses: 7
    Dernier message: 25/05/2007, 21h41
  4. questions relatives à java<=>PDF
    Par subzero82 dans le forum Documents
    Réponses: 24
    Dernier message: 08/05/2007, 15h44
  5. [Java] Question sur Java et les états.
    Par Cassios dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 19/02/2007, 17h37

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