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

API standards et tierces Java Discussion :

Erreur de connexion : java RMI & linux


Sujet :

API standards et tierces Java

  1. #1
    Membre actif

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Points : 223
    Points
    223
    Par défaut Erreur de connexion : java RMI & linux
    Bonsoir,

    nous souhaitons (moi et mes collègues) développer une application répartie en java, et, afin de faciliter les communications réseaux, nous nous sommes penché sur RMI. Ce système offre tout ce dont nous avons besoin ; nous avons donc implémenter un petit exemple que voici :

    Product.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    import java.rmi.*; 
     
    public interface Product extends Remote { 
        String getDescription() throws RemoteException;   
    }
    ProductClient.java
    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
     
    import java.rmi.*; 
    import java.rmi.server.*; 
    import javax.naming.*; 
     
    /** 
       This program demonstrates how to call a remote method 
       on two objects that are located through the naming service. 
    */ 
    public class ProductClient 
    { 
       public static void main(String[] args) 
       { 
          System.setProperty("java.security.policy", "client.policy"); 
          System.setSecurityManager(new RMISecurityManager()); 
          String url = "rmi://"+args[0]+"/"; 
             // change to "rmi://yourserver.com/" when server runs on remote machine yourserver.com 
          try 
          { 
             Context namingContext = new InitialContext(); 
             Product c1 = (Product) namingContext.lookup(url + "grille-pain"); 
             Product c2 = (Product) namingContext.lookup(url + "micro-ondes"); 
     
             System.out.println(c1.getDescription()); 
             System.out.println(c2.getDescription()); 
          } 
          catch (Exception e) 
          { 
             e.printStackTrace(); 
          } 
       } 
    }
    ProductImpl.java
    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
     
    import java.rmi.*; 
    import java.rmi.server.*; 
     
    public class ProductImpl extends UnicastRemoteObject implements Product { 
        private String name; 
     
        public ProductImpl(String n) throws RemoteException { 
            name = n; 
        } 
     
        public String getDescription() throws RemoteException { 
            return ("Je suis un " + name + ". Achetez moi!"); 
        }     
    }
    ProductServer.java
    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
    36
    37
     
    import java.rmi.*; 
    import java.rmi.registry.*; 
    import java.rmi.server.*; 
    import javax.naming.*; 
     
    public class ProductServer { 
        public static void main(String args[]){ 
            try { 
                System.out.println("Construction des implementations du serveur ..."); 
     
                ProductImpl p1 = new ProductImpl("grille-pain Moulinex"); 
                ProductImpl p2 = new ProductImpl("micro-ondes Philips"); 
     
                System.out.println("Liaison des implementations du serveur a la base de registres..."); 
     
    /*             
                Context namingContext = new InitialContext(); 
                namingContext.bind("rmi:grille-pain", p1); 
                namingContext.bind("rmi:micro-ondes", p2); 
    */             
     
     
                Registry registry=null; 
                int port = 1099; 
                registry = LocateRegistry.createRegistry(port); 
                registry.rebind( "grille-pain", p1 ); 
                registry.rebind( "micro-ondes", p2 ); 
     
     
                System.out.println("Attente des invocations des clients..."); 
            } 
            catch(Exception e){ 
                e.printStackTrace(); 
            } 
        } 
    }
    Tout ce code fonctionne très bien, en localhost (client et serveur sur la même machine), sur des machines distantes sous Windows, avec un Serveur sous Windows, et des clients sous Linux, mais on a un gros problème dès que le serveur est sous Linux :

    Voici l'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
     
    java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
            java.net.ConnectException: Connection refused
            at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
            at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
            at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
            at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
            at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHa ndler.java:179)
            at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:1 32)
            at $Proxy0.getDescription(Unknown Source)
            at ProductClient.main(ProductClient.java:28)
    Caused by: java.net.ConnectException: Connection refused
            at java.net.PlainSocketImpl.socketConnect(Native Method)
            at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
            at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
            at java.net.Socket.connect(Socket.java:507)
            at java.net.Socket.connect(Socket.java:457)
            at java.net.Socket.<init>(Socket.java:365)
            at java.net.Socket.<init>(Socket.java:178)
            at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:2 2)
            at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:1 28)
            at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569)
            ... 7 more
    Nous avons cherché, et les seules explications que nous avons trouvés parlent d'un problème de configuration de /etc/hosts , mais dans la mesure où nous n'adressons les serveurs que par leur IP, le problème ne semble pas venir de là.

    Nous avons également testé (à tout hasard) en réseau statique (pas de DHCP ), avec rigoureusement le même résultat. Nous en appelons donc à vos compétences, d'autant que ce projet est à remettre à la fin de la semaine (Circonstance atténuante : nous n'avons que deux semaines pour réaliser ce projet, un CVS réparti).

    Merci !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 85
    Points : 81
    Points
    81
    Par défaut
    Salut,

    J'ai eu une erreur comme ca avec mon serveur d'EJB. Le serveur "référence"
    les objets RMI et il les charge en mettant localhost (127.0.0.1) du coup
    quand tu y accèdes à distance, ca retourne "localhost" et le client tente un
    connection sur son localhost. En gros le client demande si le serveur a un
    des truc RMI a disposition, et il repond "oui, l'url c'est localhost:1099" et le
    client tente une connexion mais du coup ca va pas !

    Pour résoudre le problème il faut donc:
    - vérifier ton fichier /etc/hosts et ajouter l'alias qui va bien.
    - Au moment du bind() du serveur, mettre peut etre aussi l'ip réseau du
    serveur.

    C'est une histoire un peu tordu comme ca !
    Voila, j'espère que ca va vous aider un peu :-)
    a+
    Xavier

  3. #3
    Membre actif

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Points : 223
    Points
    223
    Par défaut
    Merci.

    En effet j'avais fini par comprendre ce qu'était le problème, et pour le résoudre il y avait deux solutions :

    soit lancer le serveur ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     java -Djava.rmi.server.hostname=192.168.0.2 ProductServer
    ou alors, modifier le fichier /etc/hosts de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    127.0.0.1 localhost.localdomain localhost gaston
      192.168.0.2 gaston


    vers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    192.168.0.2 gaston
       127.0.0.1 localhost.localdomain localhost gaston
    


    où gaston est le nom de ma machine et 192.168.0.2 l'ip de l'interface du réseau local, par lequel je fais les invocations.

    Merci pour le coup de main !

    Sinon autre question concernant RMI :

    Est-ce que ce service nous garanti l'exécution séquentiel de chacune des méthodes, où est-il possible que l'invocation de deux méthodes différentes sur le même objet se fassent de manière parallèle ?

    j'ai pas envi de programmer un moniteur

    merci

Discussions similaires

  1. Erreur de connexion Java DB
    Par dodyx dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 20/10/2014, 17h29
  2. Java RMI sur Linux
    Par kallelomar dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 14/04/2012, 12h04
  3. java.rmi.ConnectIOException sous linux
    Par ljonget dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/08/2009, 14h03
  4. erreur Out of memory Error+ java(jb9 sous linux)
    Par Scal-tn dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 23/04/2008, 10h27
  5. Erreur de connexion avec Java
    Par webmister dans le forum Connexions aux bases de données
    Réponses: 3
    Dernier message: 27/03/2006, 12h59

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