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

Entrée/Sortie Java Discussion :

JAVA et RMI !


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut JAVA et RMI !
    Bonjour,

    Je ne parle pas encore couramment JAVA, donc j'aurais besoin de votre aide pouvoir tester mes scripts JAVA RMI.

    Je travail sous XP, eclipse 3.5.1 et java 1.6
    >java -version
    java version "1.6.0_17"
    Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
    Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)
    J'essaye d'apprendre à faire du RMI.

    J'ai crée un package test_rmi. Voici mes classes :
    • interface : Information

    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
    package test_rmi;
    /* Définition d'une interface qui contient les méthodes qui 
     * peuvent être appelées à distance
     */
    import java.rmi.*;
     
    /*
     * L'interface à définir doit hériter de l'interface java.rmi.Remote. 
     * Cette interface ne contient aucune méthode mais indique
     * simplement que l'interface peut être appelée à distance.
     * L'interface doit contenir toutes les méthodes qui seront succeptibles d'être appelées à distance.
     */
    public interface Information extends Remote {
    	/*
    	 * Chaque méthode appelée à distance doit déclarer qu'elle est en mesure de lever l'exception
    	 */
    	public String getInformation() throws RemoteException;
     }
    • Classe implémentant l'interface : TestRMIServeurImpl


    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
    19
    20
    package test_rmi;
    import java.rmi.*;
    import java.rmi.server.*;
     
    /*
     * Classe qui implémente notre interface Information.
     * Cette classe correspond à l'objet distant. Elle doit donc implémenter 
     * l'interface définie et contenir le code nécessaire.
     * 
     * héritage de UnicastRemoteObject obligatoire
     */
    public class TestRMIServeurImpl extends UnicastRemoteObject implements Information {
    	protected TestRMIServeurImpl() throws RemoteException {
    		super();
    	}
     
    	public String getInformation() throws RemoteException {
    		return "bonjour";
    	}
    }
    • Classe qui instancie l'objet : MonServeur


    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package test_rmi;
     
    import java.rmi.*;
    import java.rmi.registry.*;
     
    /*
     * Classe qui instancie l'objet et l'enregistre
     * dans le registre en lui affectant un nom.
     */
    public class MonServeur {
     
    	public static void main(String[] args) {
    		Registry registre;
    		try {
    			System.out.println("Enregistrement du serveur");
    			// L'instanciation d'un objet de la classe distante : TestRMIServeurImpl
    			TestRMIServeurImpl ServeurRmi = new TestRMIServeurImpl();
     
    			// L'enregistrement dans le registre de nom RMI en lui donnant un nom
    			System.out.println("Enregistrement du serveur");
     
    			//Naming.rebind( "rmi://localhost:1099/MonObjetServeur", ServeurRmi );
     
    			registre = LocateRegistry.getRegistry("localhost");
    			registre.rebind("rmi://localhost:1099/MonObjetServeur", ServeurRmi);
    			System.out.println("Serveur lancé");
     
    		} catch (RemoteException e) {
    			System.out
    					.println("Pb RMI, exception capturée : " + e.getMessage());
     
    		}
    	}
     
    }
    • Le client : MonClient


    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package test_rmi;
     
    import java.rmi.*;
    import java.rmi.registry.*;
     
    /*
     * 1- Obtention d'une référence sur l'objet distant à partir de son nom
     * 2- Appel de la méthode à partir de cette référence
     */
    public class MonClient {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Registry registre;
    		Information Serveur;
     
    		try {
    			registre = (Registry) LocateRegistry.getRegistry("localhost");
    			Serveur = (Information) registre.lookup("rmi://localhost:1099/MonObjetServeur");
    			System.out.println("resultat : " + Serveur.getInformation());
    		} catch (RemoteException e) {
    			System.out.println("Pb RMI : ");
    			e.printStackTrace();
     
    		}
    		catch (NotBoundException e) {
    			e.printStackTrace();
    		}
    	}
     
    }
    Quand j'exécute le code MonClient via eclipse, j'obtiens un message d'erreur :
    Pb RMI :
    java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
    java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.newCall(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at test_rmi.MonClient.main(MonClient.java:22)
    Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
    ... 6 more
    Dans la documentation, il est demandé de générer les classes stub et skeleton. stub est une classe coté client et skeleton est coté serveur. Les deux classes gèrent les mécanismes d'appel, de communication, d'exécution, de renvoi et de réception des résultats.

    J'ai donc essayé de l'exécuter par eclipse :
    Executer => Outils externe => configuration outils externes.
    J'y ai rajouté deux programmes :
    - rmic et rmiregistry
    1- rmic
    emplacement : C:\Program Files\Java\jdk1.6.0_17\bin\rmic.exe
    Répertoire travail : ${workspace_loc:/PROJET/bin}
    Argument : test_rmi.TestRMIServeurImpl
    => appliquer et exécuter
    Cela m'a généré un fichier TestRMIServeurImpl_Stub.class mais je n'ai pas de fichier TestRMIServer_Skel.class
    Je suis obligé de rajouter l'option -vcompat pour que le fichier TestRMIServer_Skel.class se crée.

    2- rmiregistry
    emplacement : C:\Program Files\Java\jdk1.6.0_17\bin\rmiregistry.exe
    Répertoire : ${project_loc}
    => appliquer et exécuter
    Rien de spécial

    Je relance MonClient et voici le message d'erreur maintenant :
    java.rmi.NotBoundException: rmi://localhost:1099/MonObjetServeur
    at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
    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.lookup(Unknown Source)
    at test_rmi.MonClient.main(MonClient.java:22)
    Quelqu'un peut il m'aider ?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Par défaut
    Bonjour,

    Jette un coup d'oeil ici : http://www.developpez.net/forums/d83...petit-exemple/

    L'exemple marche j'ai essayé sur ma machine.

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Quel exemple, le mien ou celui de l'autre thread ? Et pourquoi mon exemple ne fonctionne pas ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Par défaut
    Je parle de l'exemple dans le lien qui est a peut près ce que tu veux faire.

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Le problème est que ça ne m'aide pas à savoir pourquoi mes scripts ne fonctionnent pas. Ce n'est pas en copiant collant les autres scripts que ça m'avancera, mon problème n'est pas juste que ça marche, mais de comprendre.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Par défaut
    Comparer ce que tu as fait avec ce qui marche n'est pas possible?

    C'est exactement la même chose, le serveur possède une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public String getInformation() throws RemoteException {
    		return "bonjour";
    	}
    que le client appelle à distance.

    et tu as regardé le dernier post de la discussion? A propose d'un fichier policy? Sans celui ci tu auras toujours des Connection refused

  7. #7
    Membre à l'essai
    Profil pro
    Enseigant-chercheur
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseigant-chercheur

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bonjour,
    Je ne parle pas encore couramment JAVA, donc j'aurais besoin de votre aide pouvoir tester mes scripts JAVA RMI.
    Salut,

    Ton code marche correctement chez moi (java 1.6, MacOSX, ligne de commande).

    Après la compilation, j'ai le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    lam-saoz:src sunye$ java test_rmi.MonServeur &
    [2] 26696
    lam-saoz:src sunye$ Enregistrement du serveur
    Enregistrement du serveur
    Serveur lancé
     
    lam-saoz:src sunye$ java test_rmi.MonClient 
    resultat : bonjour

    Le premier message d'erreur est normal lorsque le rmiregistry n'est pas lancé.

    Le deuxième message d'erreur semble indiquer que l'objet n'a pas été exporté. Es-tu sûr d'avoir lancé le serveur avant de lancer le client ?

    Amicalement,

    G. Sunyé

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par sunye Voir le message
    Salut,

    Ton code marche correctement chez moi (java 1.6, MacOSX, ligne de commande).

    Après la compilation, j'ai le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    lam-saoz:src sunye$ java test_rmi.MonServeur &
    [2] 26696
    lam-saoz:src sunye$ Enregistrement du serveur
    Enregistrement du serveur
    Serveur lancé
     
    lam-saoz:src sunye$ java test_rmi.MonClient 
    resultat : bonjour

    Le premier message d'erreur est normal lorsque le rmiregistry n'est pas lancé.

    Le deuxième message d'erreur semble indiquer que l'objet n'a pas été exporté. Es-tu sûr d'avoir lancé le serveur avant de lancer le client ?

    Amicalement,

    G. Sunyé
    Bon, tu me rassures déjà.
    bah, je fais tout ça par eclipse, donc je ne sais pas si je me suis mal pris !!

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Quand je compile MonServeur, j'ai ce message d'erreur :

    instanciation de la classe distante : TestRMIServeurImpl
    Enregistrement du serveur
    Pb RMI, exception capturée : RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: test_rmi.TestRMIServeurImpl_Stub
    Voici son code :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package test_rmi;
     
    import java.rmi.*;
    import java.rmi.registry.*;
     
    /*
     * Classe qui instancie l'objet et l'enregistre
     * dans le registre en lui affectant un nom.
     */
    public class MonServeur {
     
    	public static void main(String[] args) {
    		Registry registre;
    		try {
    			System.out.println("instanciation de la classe distante : TestRMIServeurImpl");
    			// L'instanciation d'un objet de la classe distante : TestRMIServeurImpl
    			TestRMIServeurImpl ServeurRmi = new TestRMIServeurImpl();
     
    			// L'enregistrement dans le registre de nom RMI en lui donnant un nom
    			System.out.println("Enregistrement du serveur");
     
    			//Naming.rebind( "rmi://localhost:1099/MonObjetServeur", ServeurRmi );
     
    			registre = LocateRegistry.getRegistry("localhost");
    			registre.rebind("rmi://localhost:1099/MonObjetServeur", ServeurRmi);
    			System.out.println("Serveur lancé");
     
    		} catch (RemoteException e) {
    			System.out
    					.println("Pb RMI, exception capturée : " + e.getMessage());
     
    		}
    	}
     
    }

  10. #10
    Membre à l'essai
    Profil pro
    Enseigant-chercheur
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseigant-chercheur

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Par défaut
    Citation Envoyé par djibril Voir le message
    Quand je compile MonServeur, j'ai ce message d'erreur :
    Essaye de générer la classe stub avec rmic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rmic test_rmi.TestRMIServeurImpl
    Cela va générer le fichier TestRMIServeurImpl_Stub.class, qui semble manquer à l'exécution de ton serveur.

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par sunye Voir le message
    Essaye de générer la classe stub avec rmic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rmic test_rmi.TestRMIServeurImpl
    Cela va générer le fichier TestRMIServeurImpl_Stub.class, qui semble manquer à l'exécution de ton serveur.
    Je le fais via eclipse. Et dans le répertoire bin, j'ai bien un fichier TestRMIServeurImpl_Stub.class

    Mais j'ai toujours
    instanciation de la classe distante : TestRMIServeurImpl
    Enregistrement du serveur
    Pb RMI, exception capturée : RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: test_rmi.TestRMIServeurImpl_Stub

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

Discussions similaires

  1. [Framework] [RMI] java.rmi.UnmarshalException
    Par YokoSop dans le forum Spring
    Réponses: 12
    Dernier message: 08/12/2010, 15h29
  2. Communication entre deux programmes Java. http ? Rmi ? WS ? Autres ?
    Par tiboudchou dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 26/03/2009, 12h50
  3. Problème JAVA et RMI
    Par Didi34 dans le forum Langage
    Réponses: 18
    Dernier message: 23/12/2008, 10h38
  4. Erreur de connexion : java RMI & linux
    Par pedouille dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 16/05/2006, 20h04
  5. Problême de Socket avec un applet java (RMI/policy)
    Par Vesperal dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/04/2006, 12h00

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