www jmdoudoux fr java dej chap rmi htm

19
pdfcrowd.com open in browser PRO version Are you a developer? Try out the HTML to PDF API Développons en Java v 1.80 Copyri ght (C) 1999-2012 Jean-Mi chel DOUDOUX 25. L'appel de méthodes distantes : RMI RMI (Remote Method Invocation) est une technologie développée et fournie par Sun à partir du JDK 1.1 pour permettre de mettre en oeuvre facilement des objets distribués. Ce chapitre contient plusieurs sections : La présentation et l'architecture de RMI Les différentes étapes pour créer un objet distant et l'appeler avec RMI Le développement coté serveur Le développement coté client La génération de la classe stub La mise en oeuvre des objets RMI

Upload: rahxen-legacy

Post on 24-Nov-2015

17 views

Category:

Documents


0 download

TRANSCRIPT

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    Dveloppons en Java v 1.80 Copyright (C) 1999-2012 Jean-Michel DOUDOUX

    25. L'appel de mthodes distantes : RMI

    RMI (Remote Method Invocation) est une technologie dveloppe et fournie par Sun partir du JDK 1.1 pour permettre de mettre en oeuvrefacilement des objets distribus.

    Ce chapitre contient plusieurs sections :

    La prsentation et l'architecture de RMILes diffrentes tapes pour crer un objet distant et l'appeler avec RMILe dveloppement cot serveurLe dveloppement cot clientLa gnration de la classe stubLa mise en oeuvre des objets RMI

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.1. La prsentation et l'architecture de RMI

    Le but de RMI est de permettre l'appel, l'excution et le renvoi du rsultat d'une mthode excute dans une machine virtuelle diffrente decelle de l'objet l'appelant. Cette machine virtuelle peut tre sur une machine diffrente pourvu qu'elle soit accessible par le rseau.

    La machine sur laquelle s'excute la mthode distante est appele serveur.

    L'appel cot client d'une telle mthode est un peu plus compliqu que l'appel d'une mthode d'un objet local mais il reste simple. Il consiste obtenir une rfrence sur l'objet distant puis simplement appeler la mthode partir de cette rfrence.

    La technologie RMI se charge de rendre transparente la localisation de l'objet distant, son appel et le renvoi du rsultat.

    En fait, elle utilise deux classes particulires, le stub et le skeleton, qui doivent tre gnres avec l'outil rmic fourni avec le JDK.

    Le stub est une classe qui se situe ct client et le skeleton est son homologue cot serveur. Ces deux classes se chargent d'assurer tous lesmcanismes d'appel, de communication, d'excution, de renvoi et de rception du rsultat.

    25.2. Les diffrentes tapes pour crer un objet distant etl'appeler avec RMI

    Le dveloppement cot serveur se compose de :

    La dfinition d'une interface qui contient les mthodes qui peuvent tre appeles distanceL'criture d'une classe qui implmente cette interface

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    L'criture d'une classe qui instanciera l'objet et l'enregistrera en lui affectant un nom dans le registre de nom RMI (RMI Registry)

    Le dveloppement ct client se compose de :

    L'obtention d'une rfrence sur l'objet distant partir de son nomL'appel la mthode partir de cette rfrence

    Enfin, il faut gnrer les classes stub et skeleton en excutant le programme rmic avec le fichier source de l'objet distant

    25.3. Le dveloppement cot serveur

    Ct serveur, l'objet distant est dcrit par une interface. Une instance de l'objet doit tre cr et enregistre dans le registre RMI.

    25.3.1. La dfinition d'une interface qui contient les mthodes de l'objetdistant

    L'interface dfinir doit hriter de l'interface java.rmi.Remote. Cette interface ne contient aucune mthode mais indique simplement quel'interface peut tre appele distance.

    L'interface doit contenir toutes les mthodes qui seront susceptibles d'tre appeles distance.

    La communication entre le client et le serveur lors de l'invocation de la mthode distante peut chouer pour diverses raisons telles qu'un crashdu serveur, une rupture de la liaison, etc ...

    Ainsi chaque mthode appele distance doit dclarer qu'elle est en mesure de lever l'exception java.rmi.RemoteException.

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    Exemple ( code Java 1.1 ) :

    25.3.2. L'criture d'une classe qui implmente cette interface

    Cette classe correspond l'objet distant. Elle doit donc implmenter l'interface dfinie et contenir le code ncessaire.

    Cette classe doit obligatoirement hriter de la classe UnicastRemoteObject qui contient les diffrents traitements lmentaires pour un objetdistant dont l'appel par le stub du client est unique. Le stub ne peut obtenir qu'une seule rfrence sur un objet distant hritant de la classeUnicastRemoteObject. On peut supposer qu'une future version de RMI sera capable de faire du MultiCast, permettant RMI de choisir parmiplusieurs objets distants identiques la rfrence fournir au client.

    La hirarchie de la classe UnicastRemoteObject est :

    java.lang.Object

    java.rmi.Server.RemoteObject

    java.rmi.Server.RemoteServer

    java.rmi.Server.UnicastRemoteObject

    01.02.03.04.05.06.07.08.09.

    package com.jmdoudoux.test.rmi; import java.rmi.*; public interface Information extends Remote {

    public String getInformation() throws RemoteException; }

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    Comme indiqu dans l'interface, toutes les mthodes distantes, mais aussi le constructeur de la classe, doivent indiquer qu'elles peuvent leverl'exception RemoteException. Ainsi, mme si le constructeur ne contient pas de code il doit tre redfini pour inhiber la gnration duconstructeur par dfaut qui ne lve pas cette exception.

    Exemple ( code Java 1.1 ) :

    25.3.3. L'criture d'une classe pour instancier l'objet et l'enregistrer dansle registre

    Ces oprations peuvent tre effectues dans la mthode main d'une classe ddie ou dans la mthode main de la classe de l'objet distant.L'intrt d'une classe ddie et qu'elle permet de regrouper toutes ces oprations pour un ensemble d'objets distants.

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.

    package com.jmdoudoux.test.rmi; import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject; public class InformationImpl extends UnicastRemoteObject implements Information { private static final long serialVersionUID = 2674880711467464646L;

    protected InformationImpl() throws RemoteException {super();

    } public String getInformation() throws RemoteException {System.out.println("Invocation de la mthode getInformation()");return "bonjour";

    }}

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    La marche suivre contient trois tapes :

    la mise en place d'un security manager ddi qui est facultativel'instanciation d'un objet de la classe distantel'enregistrement de la classe dans le registre de noms RMI en lui donnant un nom

    25.3.3.1. La mise en place d'un security manager

    Cette opration n'est pas obligatoire mais elle est recommande en particulier si le serveur doit charger des classes rcupres sur desmachines distantes. Sans security manager, il faut obligatoirement mettre la disposition du serveur toutes les classes dont il aura besoin(Elles doivent tre dans le CLASSPATH du serveur). Avec un security manager, le serveur peut charger dynamiquement certaines classes.

    Cependant, le chargement dynamique de ces classes peut poser des problmes de scurit car le serveur va excuter du code d'une autre machine.Cet aspect peut conduire ne pas utiliser de security manager.

    Exemple ( code Java 1.1 ) :

    Il est aussi possible d'activer un security manager en utilisant simplement l'option -Djava.security.manager de la JVM.

    01.02.03.04.05.06.07.08.09.

    public static void main(String[] args) {try {if (System.getSecurityManager() == null) {System.setSecurityManager(new RMISecurityManager());

    }} catch (Exception e) {

    e.printStrackTrace();}

    }

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.3.3.2. L'instanciation d'un objet de la classe distante

    Cette opration est trs simple puisqu'elle consiste simplement en la cration d'un objet de la classe de l'objet distant

    Exemple ( code Java 1.1 ) :

    25.3.3.3. L'enregistrement dans le registre de noms RMI

    La dernire opration consiste enregistrer l'objet cr dans le registre de noms en lui affectant un nom. Ce nom est fourni au registre sousforme d'une URL constitu du prfix rmi://, du nom du seveur (hostname) et du nom associ l'objet prcd d'un slash.

    Le nom du serveur peut tre fourni en dur sous forme d'une constante chane de caractres ou peut tre dynamiquement obtenu en utilisantla classe InetAddress pour une utilisation en locale.

    01.02.03.04.05.06.07.08.09.10.11.

    public static void main(String[] args) {try {if (System.getSecurityManager() == null) {System.setSecurityManager(new RMISecurityManager());

    } InformationImpl informationImpl = new InformationImpl();

    } catch (Exception e) {e.printStrackTrace();

    }}

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    C'est ce nom qui sera utilis dans une URL par le client pour obtenir une rfrence sur l'objet distant.

    L'enregistrement se fait en utilisant la mthode rebind de la classe Naming. Elle attend en paramtre l'URL du nom de l'objet et l'objet luimme.

    Exemple ( code Java 1.1 ) :

    25.3.3.4. Le lancement dynamique du registre de noms RMI

    Sur le serveur, le registre de nom RMI doit s'excuter avant de pouvoir enregistrer un objet ou obtenir une rfrence.

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.

    public static void main(String[] args) {try {if (System.getSecurityManager() == null) {System.setSecurityManager(new RMISecurityManager());

    } InformationImpl informationImpl = new InformationImpl();

    String url = "rmi://" + InetAddress.getLocalHost().getHostAddress() + "/TestRMI";System.out.println("Enregistrement de l'objet avec l'url : " + url);Naming.rebind(url, informationImpl);

    System.out.println("Serveur lanc");

    } catch (RemoteException e) {e.printStackTrace();

    } catch (MalformedURLException e) {e.printStackTrace();

    } catch (UnknownHostException e) {e.printStackTrace();

    }}

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    Ce registre peut tre lanc en tant qu'application fournie dans le JDK (rmiregistry) comme indiqu dans un chapitre suivant ou tre lancdynamiquement dans la classe qui enregistre l'objet. Ce lancement ne doit avoir lieu qu'une seule et unique fois. Il peut tre intressantd'utiliser le code ci-dessous si l'on cre une classe ddie l'enregistrement des objets distants.

    Le code pour excuter le registre est la mthode createRegistry() de la classe java.rmi.registry.LocateRegistry. Cette mthode attend enparamtre un numro de port.

    Exemple ( code Java 1.1 ) :

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.

    package com.jmdoudoux.test.rmi; import java.net.InetAddress;import java.net.MalformedURLException;import java.net.UnknownHostException;import java.rmi.Naming;import java.rmi.RMISecurityManager;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry; public class LanceServeur { public static void main(String[] args) {try {LocateRegistry.createRegistry(1099);

    System.out.println("Mise en place du Security Manager ...");if (System.getSecurityManager() == null) {System.setSecurityManager(new RMISecurityManager());

    }

    InformationImpl informationImpl = new InformationImpl();

    String url = "rmi://" + InetAddress.getLocalHost().getHostAddress() + "/TestRMI";System.out.println("Enregistrement de l'objet avec l'url : " + url);Naming.rebind(url, informationImpl);

    System.out.println("Serveur lanc");

    } catch (RemoteException e) {e.printStackTrace();

    } catch (MalformedURLException e) {

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.4. Le dveloppement cot client

    L'appel d'une mthode distante peut se faire dans une application ou dans une applet.

    25.4.1. La mise en place d'un security manager

    Comme pour le cot serveur, cette opration est facultative.

    Le choix de la mise en place d'un scurity manager ct client suit des rgles identiques celui du ct serveur. Sans son utilisation, il estncessaire de mettre dans le CLASSPATH du client toutes les classes ncessaires dont la classe stub.

    Exemple ( code Java 1.1 ) :

    31.32.33.34.35.36.37.

    } catch (MalformedURLException e) {e.printStackTrace();

    } catch (UnknownHostException e) {e.printStackTrace();

    }}

    }

    1.2.3.4.5.

    public static void main(String[] args) {if (System.getSecurityManager() == null) {System.setSecurityManager(new RMISecurityManager());

    }}

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.4.2. L'obtention d'une rfrence sur l'objet distant partir de son nom

    Pour obtenir une rfrence sur l'objet distant partir de son nom, il faut utiliser la mthode statique lookup() de la classe Naming.

    Cette mthode attend en paramtre une URL indiquant le nom qui rfrence l'objet distant. Cette URL est compose de plusieurs lments : leprfix rmi://, le nom du serveur (hostname) et le nom de l'objet tel qu'il a t enregistr dans le registre prcd d'un slash.

    Il est prfrable de prvoir le nom du serveur sous forme de paramtres de l'application ou de l'applet pour plus de souplesse.

    La mthode lookup() va rechercher dans le registre du serveur l'objet et retourner un objet stub. L'objet retourn est de la classe Remote(cette classe est la classe mre de tous les objets distants).

    Si le nom fourni dans l'URL n'est pas rfrenc dans le registre, la mthode lve l'exception NotBoundException.

    Exemple ( code Java 1.1 ) :

    01.02.03.04.05.06.07.08.09.10.11.12.13.

    public static void main(String[] args) { if (System.getSecurityManager() == null) {System.setSecurityManager(new RMISecurityManager());

    } try {Remote r = Naming.lookup("rmi://10.0.0.13/TestRMI");

    } catch (Exception e) {e.printStrackTrace();

    }

    }

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.4.3. L'appel la mthode partir de la rfrence sur l'objet distant

    L'objet retourn tant de type Remote, il faut raliser un cast vers l'interface qui dfinit les mthodes de l'objet distant. Pour plus descurit, on vrifie que l'objet retourn est bien une instance de cette interface.

    Un fois le cast ralis, il suffit simplement d'appeler la mthode.

    Exemple ( code Java 1.1 ) :

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.

    package com.jmdoudoux.test.rmi; import java.net.MalformedURLException;import java.rmi.Naming;import java.rmi.NotBoundException;import java.rmi.RMISecurityManager;import java.rmi.Remote;import java.rmi.RemoteException; public class LanceClient { public static void main(String[] args) {System.out.println("Lancement du client");if (System.getSecurityManager() == null) {System.setSecurityManager(new RMISecurityManager());

    }try {Remote r = Naming.lookup("rmi://10.0.0.13/TestRMI");System.out.println(r);if (r instanceof Information) {String s = ((Information) r).getInformation();System.out.println("chaine renvoyee = " + s);

    }} catch (MalformedURLException e) {e.printStackTrace();

    } catch (RemoteException e) {e.printStackTrace();

    } catch (NotBoundException e) {

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.4.4. L'appel d'une mthode distante dans une applet

    L'appel d'une mthode distante est le mme dans une application et dans une applet.

    Seule la mise en place d'un security manager ddi dans les applets est inutile car elles utilisent dj un scurity manager(AppletSecurityManager) qui autorise le chargement de classes distantes.

    Exemple ( code Java 1.1 ) :

    28.29.30.31.32.33.

    } catch (NotBoundException e) {e.printStackTrace();

    }System.out.println("Fin du client");

    }}

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.

    package com.jmdoudoux.test.rmi; import java.applet.*;import java.awt.*;import java.rmi.*; public class AppletTestRMI extends Applet { private String s;

    public void init() {

    try {Remote r = Naming.lookup("rmi://10.0.0.13/TestRMI");

    if (r instanceof Information) {s = ((Information) r).getInformation();}

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.5. La gnration de la classe stub

    Pour gnrer la classe stub, il suffit d'utiliser l'outil rmic fourni avec le JDK en lui donnant en paramtre le nom pleinement qualifi de laclasse.

    Attention la classe doit avoir t compile : rmic besoin du fichier .class.

    Exemple ( code Java 1.1 ) :

    rmic va gnrer et compiler la classe stub sous le nom InformationImpl_Stub.class. Cette classe sera utilis par la partie cliente pour invoquerl'objet distant correspondant.

    18.19.20.21.22.23.24.25.26.27.28.

    }} catch (Exception e) {e.printStrackTrace();

    }}

    public void paint(Graphics g) {super.paint(g);g.drawString("chaine retourne = "+s,20,20);

    }}

    1. rmic com.jmdoudoux.test.rmi.InformationImpl

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    25.6. La mise en oeuvre des objets RMI

    La mise en oeuvre et l'utilisation d'objets distants avec RMI ncessite plusieurs tapes :

    1. Dmarrer le registre RMI sur le serveur soit en utilisant le programme rmiregistry livr avec le JDK soit en excutant une classe quieffectue le lancement.

    2. Excuter la classe qui instancie l'objet distant et l'enregistre dans le serveur de noms RMI3. Lancer l'application ou l'applet pour tester.

    25.6.1. Le lancement du registre RMI

    La commande rmiregistry est fournie avec le JDK. Il faut la lancer en tche de fond :

    Sous Unix : rmiregistry&

    Sous Windows : start rmiregistry

    Ce registre permet de faire correspondre un objet un nom et inversement. C'est lui qui est sollicit lors d'un appel aux mthodesNaming.bind() et Naming.lookup()

    25.6.2. L'instanciation et l'enregistrement de l'objet distant

    Il faut excuter la classe qui va instancier l'objet distant et l'enregistrer sous son nom dans le registre prcdemment lanc.

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    Pour ne pas avoir de problme, il faut s'assurer que toutes les classes utiles (la classe de l'objet distant, l'interface qui dfinit les mthodes)sont prsentes dans un rpertoire dfini dans le classpath.

    Si un gestionnaire de scurit est mis en place, il faut dfinir un fichier qui va contenir la politique de scurit qu'il doit mettre en oeuvre.

    Exemple ( code Java 1.1 ) : le fichier ma_policy_serveur

    Les permissions dfinies concernent les permissions de connexions par socket au serveur.

    Lors du lancement du serveur, l'option java.security.policy permet de prciser le fichier qui sera utilis par le gestionnaire de scurit.

    Exemple ( code Java 1.1 ) : le fichier ma_policy_serveur

    25.6.3. Le lancement de l'application cliente

    L'archive de la partie cliente doit contenir le client, l'interface de l'objet distant et le stub qui a t gnr par rmic.

    1.2.3.4.5.

    grant{permission java.net.SocketPermission "localhost:1099", "connect, resolve";permission java.net.SocketPermission "*:1024-", "connect, resolve";permission java.net.SocketPermission "*:1024-", "accept, resolve";};

    1.2.3.4.5.

    C:\Users\Jean Michel\workspace\TestRmiServer>java -cp bin -Djava.security.policy=ma_policy_serveur com.jmdoudoux.test.rmi.LanceServeurMise en place du Security Manager ...Enregistrement de l'objet avec l'url : rmi://10.0.0.13/TestRMIServeur lanc

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    Exemple :

    Le client qui invoque l'objet distant est invoqu de manire classique.

    Exemple :

    Si le serveur n'est pas dmarr, une exception est leve

    Exemple :

    1.2.3.4.5.

    C:\temp>jar -tf TestRMIClient.jarMETA-INF/MANIFEST.MFcom/jmdoudoux/test/rmi/Information.classcom/jmdoudoux/test/rmi/InformationImpl_Stub.classcom/jmdoudoux/test/rmi/LanceClient.class

    1.2.3.4.5.6.

    C:\temp>java -jar TestRMIClient.jarLancement du clientInformationImpl_Stub[UnicastRef [liveRef: [endpoint:[10.0.0.13:62802](remote),objID:[7b7739e4:135b4a87a5e:-7fff, -3323459310870193038]]]]chaine renvoyee = bonjourFin du client

    01.02.03.04.05.06.07.08.09.

    C:\temp>java -jar TestRMIClient.jarLancement du clientjava.rmi.ConnectException: Connection refused to host: 10.0.0.13; nested exception is:

    java.net.ConnectException: Connection timed out: connectat 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)

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    La partie client peut tre lance avec un gestionnaire et une politique de scurit associe.

    Exemple ( code Java 1.1 ) :

    Si le gestionnaire est activ sans policy associ, alors la connexion au serveur est impossible.

    Exemple ( code Java 1.1 ) :

    09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.

    at sun.rmi.server.UnicastRef.newCall(Unknown Source)at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)at java.rmi.Naming.lookup(Unknown Source)at com.jmdoudoux.test.rmi.LanceClient.main(LanceClient.java:17)

    Caused by: java.net.ConnectException: Connection timed out: connectat java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)at java.net.AbstractPlainSocketImpl.connect(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.(Unknown Source)at java.net.Socket.(Unknown Source)at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S

    ource)at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S

    ource)... 7 more

    Fin du client

    1.2.3.4.5.6.

    C:\temp>java -jar -Djava.security.policy=ma_policy_client TestRMIClient.jarLancement du clientInformationImpl_Stub[UnicastRef [liveRef: [endpoint:[10.0.0.13:62802](remote),objID:[7b7739e4:135b4a87a5e:-7fff, -3323459310870193038]]]]chaine renvoyee = bonjourFin du client

  • pdfcrowd.comopen in browser PRO version Are you a developer? Try out the HTML to PDF API

    Dveloppons en Java v 1.80 Copyright (C) 1999-2012 Jean-Michel DOUDOUX

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

    C:\temp>java -jar -Djava.security.manager TestRMIClient.jarLancement du clientException in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "10.0.0.13:1099" "connect,resolve")

    at java.security.AccessControlContext.checkPermission(Unknown Source)at java.security.AccessController.checkPermission(Unknown Source)at java.lang.SecurityManager.checkPermission(Unknown Source)at java.lang.SecurityManager.checkConnect(Unknown Source)at java.net.Socket.connect(Unknown Source)at java.net.Socket.connect(Unknown Source)at java.net.Socket.(Unknown Source)at java.net.Socket.(Unknown Source)at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S

    ource)at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S

    ource)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 java.rmi.Naming.lookup(Unknown Source)at com.jmdoudoux.test.rmi.LanceClient.main(LanceClient.java:17)