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

Langage Java Discussion :

Problème JAVA et RMI


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Problème JAVA et RMI
    Bonjour à toutes et à tous.

    Je suis débutant en java et je dois réaliser un projet Client/serveur en intégrant la notion de RMI.

    Le problème c'est qu'au lancement de mon programme, Eclipse me "crache" ce message d'erreur cote Serveur:

    java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
    java.net.ConnectException: Connection refused: connect

    Du fait que je travaille en Localhost pour tester mes deux programmes, l'adresse du serveur est donc 127.0.0.1:20000.

    Je vous présente le code 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
    15
    16
    17
     
    public static void main(String[] args) throws InterruptedException, RemoteException {
    try{
    	Registry registry = LocateRegistry.createRegistry(20000);
    	Naming.rebind ("rmi://127.0.0.1/Spectre", unClient);  	// dans le registre local
    	Naming.rebind ("rmi://127.0.0.1/Spectre", deuxClient);  // dans le registre local
    }
     catch(Exception e){System.out.println(e.toString());}
     
    Et je vous présente le code Client:
    public static void main(String[] args) {
     
    try{
          Registry registry=LocateRegistry.getRegistry();// recupere un OD 
          Spectre agenceSpectre=(Spectre)Naming.lookup("rmi://127.0.0.1:20000/Spectre");
    }
    catch(Exception e){System.out.println(e.toString());}
    Quelqu'un aurait une idée, une démarche a me proposer?
    J'ai vu pas mal de chose sur Google mais je ne comprend rien aux manip...

    En vous remerciant par avance

  2. #2
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 58
    Points : 73
    Points
    73
    Par défaut
    Salut.

    Je ne sais pas vraiment si le problème vient de là. Mais il y a une différence entre "localhost" et "127.0.0.1".
    Sur certain système (solaris par exemple), si une connexion est ouverte sur "localhost", elle ne sera pas accessible via "127.0.0.1".
    Dans ingénieur il y a génie. Alors prouvez le !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    bonjour wizaord,
    je viens de tester en remplacant le 127.0.0.1 en localhost.
    Toujours la mème erreur!!!!

    Tu vois autre chose? ou quelqu'un d'autre aurrait une solution?

  4. #4
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    As-tu essayé de lancer rmiregistry à part et de t'y connecter comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Registry registry = LocateRegistry.getRegistry();

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    Oui Alexis,
    Il y a cette ligne dans le code Serveur que j'ai mis dans le premier message de ce sujet!

    Qu'est ce que tu peux me proposer d'autre?
    Je pensais aussi, il n'y aurait pas un plug-in a telecharger et a installer pour Eclipse 3.4???

  6. #6
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    Non, dans ton exemple, le client accès au registre par getRegistry et le serveur crée le registre par createRegistry.

    Ce que je te propose, c'est de créer un registre indépendant, par la commande rmiregistry et d'y connecter le serveur par getRegistry.


    Sinon, je reviens à ton code. J'ai rejoué ton test et ai réussi à le faire marcher de 2 façons différentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Registry registry = LocateRegistry.createRegistry(20000);
    	Naming.rebind("//localhost:20000/Spectre", spectre);
    (j'ai enlevé rmi dans le bind)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Registry registry = LocateRegistry.createRegistry(20000);
    	registry.rebind("Spectre", spectre);
    J'espère que ça fonctionnera chez toi.
    ou, ce que je préfère,

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    Pas mal SEWATECH!

    Alors, y'a du nouveau:
    Coté serveur pas d'erreur (j'ai rajouté le num du port apres l'@ IP), sa se lance mais je ne vois pas ce que sa fait...Mais pas d'erreur dc....je pense que sa roule.

    Coté client: toujours la mm erreur:
    Je reposte donc mes codes modifiés:
    SERVEUR:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static void main(String[] args) throws InterruptedException, RemoteException {
    try{
    	Registry registry = LocateRegistry.createRegistry(20000);
    	Naming.rebind ("rmi://127.0.0.1:20000/Spectre", unClient);  	// dans le registre local
    	Naming.rebind ("rmi://127.0.0.1:20000/Spectre", deuxClient);  // dans le registre local
    }
     catch(Exception e){System.out.println(e.toString());}
    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
     
    public static void main(String[] args) {
     
    try{
          Registry registry=LocateRegistry.getRegistry();// recupere un OD 
          Spectre agenceSpectre=(Spectre)Naming.lookup("rmi://127.0.0.1:20000/Spectre");
    }
    catch(Exception e){System.out.println(e.toString());}
     
    ERREUR CLIENT:
    java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
    	java.net.ConnectException: Connection refused: connect
     
     
    Pourrais-tu encore m'aider???
    En tout cas merci bcp déja pour le serveur (c'est déja ca de fait!;))

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    Toutes mes excuses.
    J'avais toujours un message d'erreur car mon serveur n'était pas lancé!

    Bon, j'ai bien lancé mon serveur (il ronronne c'est du bonheur LOL)

    Coté client j'ai rajouté le numéro du port dans la fonction rebind("rmi://127.0.0.1:20000/Spectre)

    J'ai donc une nouvelle erreur:
    java.lang.ClassCastException: $Proxy0 cannot be cast to Spectre
    KEZAKO???
    Ca veut dire que le type de cast que je fais doit etre du mème type que l'objet que je passe en paramètre dans la fonction rebind de mon serveur?

  9. #9
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    Spectre est bien une interface, j'espère !

    Et tu as respecté les préliminaires du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Spectre localSpectre = new SpectreImpl();
    	Spectre spectre = (Spectre) unicastRemoteObject.exportObject(localSpectre, 0);

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    J'ai rajouté un getregistry(20000) dans mon client.
    J'ai toujours ce problème de cast en fait!

  11. #11
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    As-tu vérifié si Spectre est une interface ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    Non ce n'est pas une interface...
    C'est une simple classe, quel est l'interet que cela soit une interface?
    il faut que je fasse:

    class Spectre extends Interface ?

  13. #13
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    C'est fondamental car ce que tu récupère coté client n'est pas un instance de ta classe, mais un stub. Le stub est généré dynamiquement par RMI pour te fournir un accès distant ; et la génération se fait à partir d'une interface.

    Il faut donc que tu crées une interface Spectre, qui hérite de Remote, puis que tu crées une classe SpectreImpl qui implémente Spectre. Dans toutes tes déclarations, tu utilises l'interface et tu n'utilises la classe que pour l'instanciation.

    Pour UnicastRemoteObject.exportObject(), je crois que c'est pour assurer une portabilité de ton serveur. Cela permet surtout d'assurer son fonctionnement quel que soit le protocole réseau associé à RMI (JRMP ou IIOP). Ton serveur doit pouvoir fonctionner sans.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    Ok, je comprend un peu mieux! (t'es un )

    Une derniere question.
    Si je passe ma classe Mère en stub.
    Comment de l'autre coté je peux la réutiliser?
    Puisque le principe de faire une classe fille c'est de pouvoir spécifier la mère non?

    quel est le but a la fin: coté client on ne peut pas utiliser la classe et que seule le serveur a accès a la classe fille (qui spécifie toutes les methodes de la classe mère)?

  15. #15
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    Tu as tout compris. La classe reste sur le serveur et seule l'interface est connue des deux cotés. Coté client, tu ne manipules pas directement l'instance que tu as créé, mais le stub dont le rôle est de transmettre ton appel de méthode à l'objet sur le serveur.

    Attention, si les méthodes de ton interface remote ont des arguments, leurs types, qu'ils soient des classes ou des interfaces, doivent être connues des deux coté.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    Ok, merci beaucoup ta précieuse aide sewatech, grace a toi j'ai gagné un temps fou et j'ai surtout bien compris l'interet du RMI.
    Pour conclure cette discussion, je te demande une derniere question.

    Comme tu viens de le dire dans mon interface remote j'ai des arguments et notamment des passages d'objets.

    Comment puis-je faire pour les faire passer a ma classe Client ? (par le stub je suppose mais comment? par des getters et setters?)

  17. #17
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    Tu utilises le système de passage d'arguments standard. La seule subtilité, c'est que tous les objets passés doivent implémenter Serializable.

  18. #18
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Pour info j'avais déjà eu l'exception que tu mentionnais en début de post avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LocateRegistry.createRegistry(20000);
    Parce que 20000 n'est pas le port par défaut de l'annuaire, logiquement c'est le 1099
    Désolé si j'arrive après la guerre.
    " Je préfère comprendre les gens qui ne me comprennent pas "

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut
    Salut Jabbal'H!

    En effet c'est apres la bataille lol, mais sewatech a géré pour l'aide!
    Pour le port de RMI, tu peux le changer :
    Registry registry = LocateRegistry.createRegistry(20000)

    Il faut penser apres a rajouter ce port dans l'adresse apres:
    Naming.rebind ("rmi://127.0.0.1:20000/Spectre", objpasse);

    ++

    ENCORE MERCI A sewatech

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

Discussions similaires

  1. Problème Java RMI - Stubs Not Found
    Par mamatt dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 29/01/2009, 12h57
  2. problème Java RMI
    Par mog83 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 16/05/2008, 20h57
  3. [EJB3] [JBoss] Problème java.lang.NoClassDefFoundError:
    Par jctigre dans le forum Java EE
    Réponses: 3
    Dernier message: 24/04/2006, 13h33
  4. Problème Java/MySql : "Unknown database"
    Par darkflo dans le forum JDBC
    Réponses: 3
    Dernier message: 24/03/2006, 11h34
  5. problème java run time environment
    Par abrmed dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 19/08/2005, 13h27

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