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
J'essaye d'apprendre à faire du RMI.>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'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
Quand j'exécute le code MonClient via eclipse, j'obtiens un message d'erreur :
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(); } } }
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.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
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 :
Quelqu'un peut il m'aider ?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)
Merci
Partager