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 :

[RMI] problème objet distant


Sujet :

API standards et tierces Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut [RMI] problème objet distant
    Bonjour à tous,
    Je suis actuellement en train de concevoir une application de type messenger, en utilisant le protocole RMI.

    Le shéma de fonctionnement est le suivant :
    - Un objet "gestionnaire de connexion" est enregistré dans le service de nommage du serveur.
    - Il posséde en attribut une instance d'un objet "MessengerServer"
    - Ce MessengerServer posséde lui une liste de tous les "Messenger" clients actuellement connectés.
    - Le client récupére tout d'abord l'instance du "gestionnaire de connexion" via le service de nommage du serveur.
    - Le client appele la méthode connect() du gestionnaire de connexion en lui passant un login et un password. Si ces paramètres sont corrects, le gestionnaire de connexion renvoie au client l'instance de l'objet MessengerServer.
    - Le client pourra ainsi récupérer la liste des Messenger connectés...

    Mon application fonctionne parfaitement en local, mais j'ai des soucis quand il s'agit de lancer serveur et client sur deux machines séparées.

    Voici le code exécuté lors du lancement du serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    java.rmi.registry.LocateRegistry.createRegistry(1099);
    MessengerServerImpl messengerServer = new MessengerServerImpl();
    GestionnaireConnection gestionnaireConnection = new GestionnaireConnectionImpl(messengerServer);
    Naming.rebind("GestionnaireConnection",gestionnaireConnection);
    et voici le code éxécuté par le client pour récupérer le gestionnaire de connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.gestionnaireConnection = (GestionnaireConnection) Naming
    		.lookup("rmi://(adresse_ip_du_server)/GestionnaireConnection");
    Visiblement mon client arrive à récupérer (avec un délai de 5-10 secondes qui me laisse perplexe) le gestionnaire de connexion, mais une exception est levée coté client lors de l'appel de la méthode connect() sur cet objet (ConnectException : connexionRefused to 10.0.0.1).

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    fais voir le contenu de ton fichier java.policy (dans jre/lib/security)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    le voici:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    // Standard extensions get all permissions by default
     
    grant codeBase "file:${{java.ext.dirs}}/*" {
    	permission java.security.AllPermission;
    };
     
    // default permissions granted to all domains
     
    grant { 
    	// Allows any thread to stop itself using the java.lang.Thread.stop()
    	// method that takes no argument.
    	// Note that this permission is granted by default only to remain
    	// backwards compatible.
    	// It is strongly recommended that you either remove this permission
    	// from this policy file or further restrict it to code sources
    	// that you specify, because Thread.stop() is potentially unsafe.
    	// See "http://java.sun.com/notes" for more information.
    	permission java.lang.RuntimePermission "stopThread";
     
    	// allows anyone to listen on un-privileged ports
    	permission java.net.SocketPermission "localhost:1024-", "listen";
     
    	// "standard" properies that can be read by anyone
     
    	permission java.util.PropertyPermission "java.version", "read";
    	permission java.util.PropertyPermission "java.vendor", "read";
    	permission java.util.PropertyPermission "java.vendor.url", "read";
    	permission java.util.PropertyPermission "java.class.version", "read";
    	permission java.util.PropertyPermission "os.name", "read";
    	permission java.util.PropertyPermission "os.version", "read";
    	permission java.util.PropertyPermission "os.arch", "read";
    	permission java.util.PropertyPermission "file.separator", "read";
    	permission java.util.PropertyPermission "path.separator", "read";
    	permission java.util.PropertyPermission "line.separator", "read";
     
    	permission java.util.PropertyPermission "java.specification.version", "read";
    	permission java.util.PropertyPermission "java.specification.vendor", "read";
    	permission java.util.PropertyPermission "java.specification.name", "read";
     
    	permission java.util.PropertyPermission "java.vm.specification.version", "read";
    	permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
    	permission java.util.PropertyPermission "java.vm.specification.name", "read";
    	permission java.util.PropertyPermission "java.vm.version", "read";
    	permission java.util.PropertyPermission "java.vm.vendor", "read";
    	permission java.util.PropertyPermission "java.vm.name", "read";
    };

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    essaye d'ajouter ca au debut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    grant { 
    	permission java.net.SocketPermission "*:80-65535","connect,accept,listen,resolve";
            permission java.security.AllPermission;
    };
    Si ca marche, tu pourras restreindre les permissions juste au adresses/ports qui sont vraiment utiles (1099 pour RMI je crois)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Merci de ta réponse, et désolé de répondre si tard, mais c'est pas évident de trouver quelqu'un qui puisse me tester ça à chaque fois...

    Alors malheureusement, ça ne change rien. Je ne sais pas si ça joue, mais je suis dérrière un routeur, mais mon port est correctement ouvert (TCP 1099).

    Lors de l'enregistrement du gestionnaire de connexion dans le service de nommage, je fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Naming.rebind("GestionnaireConnection",gestionnaireConnection);
    J'ai essayé de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Naming.rebind("rmi://(mon_adresse_ip_internet)/GestionnaireConnection",gestionnaireConnection);
    Mais la c'est une Exception chez le serveur qui est levée au bout de 10 secondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.rmi.ConnectException: Connection refused to host: xx.xx.xx.xx; nested exception is: 
    	java.net.ConnectException: Connection timed out: connect
    (xx.xx.xx.xx correspond a mon ip internet)

    Voila je me demande quelle méthode je dois suivre... C'est vraiment frustrant car mon application marche très bien en local, mais impossible de la faire fonctionner sur des machines distantes.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    J'ai trouvé une solution sur les forums de Sun pour lancer un serveur RMI qui se trouve derrière un firewall

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    System.setProperty("java.rmi.server.hostname", "mon_ip_publique");			
    java.rmi.registry.LocateRegistry.createRegistry(1099);
    MessengerServerImpl messengerServer = new MessengerServerImpl();
    Connection connection = new Connection(messengerServer);
    Naming.rebind("Connection",connection);
    Aparamment cette solution fonctionne bien, mais chez moi, au bout d'environ une minute, le serveur se coupe automatiquement...
    Si quelqu'un a déja expérimenté le déploiement d'une application RMI, je suis preneur.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/03/2011, 15h52
  2. Identifier des objet distant en RMI
    Par Dryss51 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 19/02/2008, 00h23
  3. rmi recuperation objet distant
    Par semaj_james dans le forum Langage
    Réponses: 1
    Dernier message: 30/04/2007, 16h35
  4. [RMI] Problème de communication entre deux machines distantes
    Par georges_jung dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 10/04/2007, 18h03
  5. [RMI] problème de compilation ou de configuration
    Par Michel38 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 13/07/2005, 11h00

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