Java rmi tuto oracle

Résolu
Bonjour,

J'essaye de mettre en place ce tutoriel "https://docs.oracle.com/javase/tutorial/rmi/example.html" pour un projet que je dois faire.

Je n'arrive pas du tout à le faire fonctionner... quelqu'un a déjà utiliser ce tutoriel ?

Est-ce que je peux tester ce genre de programme sur un seul OS, client serveur ?

J'arrive pas du tout à comprendre comment ça fonctionne...

Est-ce qu'il faut 2 pc ? est-ce que je peux utiliser ça sur mon mac (coté client) et sur un Vmware avec windows 7 ( coté client ) ?

J'essaye de mettre en place le Java RMI, un client serveur, mais j'arrive à rien...

J'ai créé tous mes codes java comme dans le tuto... mais quand j'utilise les commandes il y en a aucune qui fonctionne...

need help svp

Cordialement,

Capa57

7 réponses

  1. jai réussi avec ton exemple en local... :) merci

    me reste plus qu'a tester à distance...

    j'ai essayé vite fait il me dit : access denied... il y a un problème avec le parefeux ? il faut régler un truc ?
    1. ok merci je vais essayer ;)
  2. juste une question si maintenant je veux essayer sur 2 ordinateurs différents... comment faut-il procéder ?
    1. Modérateur
      Il faudrait tester parce que je ne suis pas sûr mais je pense qu'il faudrait mettre le serveur et le registre sur le même ordinateur et le client sur le deuxième ordinateur en changeant "localhost" par le nom d'accès au serveur.

      Remarque : les classes Server/Hello devront être sur la machine serveur, les classes Client/Hello sur la machine client.

      Remarque : théoriquement il me semble que le registre peut-être sur un troisième ordinateur, mais là ça va commencer à être compliqué à paramétrer.
    2. oki mais au lieu de localhost il faudrait que j'utilise l'ip de l'ordinateur à distance ?
    3. Modérateur
      Normalement avec l'adresse ip ça devrait fonctionner.
  3. ok je vais jeter un oeil là dessus, merci beaucoup de ton aide ;)
    1. Modérateur
      Voici un exemple complet, testé avec Java 7 sous Windows 7.
      Je fais tout à la main (pas d'Eclipse ou Netbeans, juste Java)

      Je suppose que tu travailles dans le dossier "C:\Workspace\RMI" et qu'il contient deux dossiers "src" et "bin".

      Dans "src" je mets des sous-répertoires "ccm" puis "rmi" pour mon architecture de package et je mets les trois codes suivants :

      C:\Workspace\RMI\src\ccm\rmi\Hello.java

      package ccm.rmi;

      import java.rmi.Remote;
      import java.rmi.RemoteException;

      public interface Hello extends Remote
      {
      String BIND = "ccm.rmi.Hello";
      String sayHello(String name) throws RemoteException;
      }

      C:\Workspace\RMI\src\ccm\rmi\Server.java

      package ccm.rmi;

      import java.rmi.registry.Registry;
      import java.rmi.registry.LocateRegistry;
      import java.rmi.server.UnicastRemoteObject;

      public class Server implements Hello
      {
      public String sayHello(String name)
      {
      return "Hello "+name+" !";
      }

      public static void main(String args[]) throws Exception
      {
      Hello hello = (Hello) UnicastRemoteObject.exportObject(new Server(), 0);
      Registry registry = LocateRegistry.getRegistry();
      registry.bind(Hello.BIND, hello);
      System.out.println("server ready");
      }
      }

      C:\Workspace\RMI\src\ccm\rmi\Client.java

      package ccm.rmi;

      import java.rmi.registry.LocateRegistry;
      import java.rmi.registry.Registry;

      public class Client
      {
      public static void main(String[] args) throws Exception
      {
      Registry registry = LocateRegistry.getRegistry("localhost");
      Hello hello = (Hello) registry.lookup(Hello.BIND);
      System.out.println(hello.sayHello("World"));
      }
      }

      Enfin, je lances un petit fichier de commandes pour compiler les classes, démarrer le registre, le serveur, puis le client :

      javac -d C:\Workspace\RMI\bin C:\Workspace\RMI\src\ccm\rmi\*.java
      start rmiregistry -J-Djava.rmi.server.codebase=file:///C:/Workspace/RMI/bin/
      start java -classpath C:\Workspace\RMI\bin ccm.rmi.Server
      java -classpath C:\Workspace\RMI\bin ccm.rmi.Client
      pause

      NB. la commande "start" permet de lancer la commande dans une nouvelle fenêtre, tu devrais donc avoir trois fenêtres ouvertes : le registre (qui n'affiche rien), le serveur (qui affiche "server ready") et le client (qui affiche "Hello World !").
      1. j'ai testé ce tutorial : https://www.youtube.com/watch?v=vkw275ptI3E

        quand j'essaie de lancer le serveur j'ai cette grosse erreur...

        je dois faire quoi ? oO

        java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.lang.ClassNotFoundException: simple.rmi.server.MyServer_Stub
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:400)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248)
        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:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:680)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
        at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
        at simple.rmi.server.MyServer.main(MyServer.java:33)
        Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.lang.ClassNotFoundException: simple.rmi.server.MyServer_Stub
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:390)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248)
        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:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:680)
        Caused by: java.lang.ClassNotFoundException: simple.rmi.server.MyServer_Stub
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1185)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:249)
        at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1198)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:433)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:164)
        at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
        at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
        at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:201)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1589)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1494)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1748)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
        ... 12 more
        1. hummm merci

          mais je comprends pas ce que je dois faire :(