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

Entrée/Sortie Java Discussion :

Programme utilisant RMI ( serveur/client )


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut Programme utilisant RMI ( serveur/client )
    Bonjour,

    Je développe en ce moment une application java qui nécessite un "serveur" et un "client" utilisant les propriétés de la RMI.

    Je n'arrive pas à rendre le client "indépendant" du serveur. Je m'explique.
    Je veut que le serveur créé des objets et les mette "accessible" avec mon hostname. Jusque la tout va bien ( utilisation des inet adresses etc ).

    Mon problème commence lorsque je m'intéresse au coté client.
    Je veut que mon client récupère ( à l'aide d'un lookup() ) les objets accessibles. Mais comment le client peut il savoir le nom des objets puisque le Hostname du serveur en fait partie et que le client ne connait pas le hostname du serveur?

    Il y a-t-il moyen d'éviter le hostname du serveur lors de la mise en réseau avec le rebind()?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Malheureusement, rien n'est magique. Le client doit savoir avec qui il doit dialoguer, et ensuite il doit savoir ce qu'il faut qu'il récupère. Il est toujours possible d'ajouter des couches d'abstractions supplémentaires : lire la conf serveur sur une base de données pour la connexion, appeler un objet générique propre à un client qui contient toute la conf pour récupérer les objets de manière dynamique... Mais au final tu auras toujours du code en dur à un moment donné
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    Alors comment puis-je définir un nom standard a mes objets distant?
    -> Dans mon rebind() je doit lui dire ou se trouve l'objet. Ma ligne est :

    context.rebind("rmi://ELVERION/plateau", plateau);
    => ELVERION est mon Hostname, plateau est mon objet.

    Le problème, est que si je met, à la place d'ELVERION, un autre nom, le programme serveur me donne une belle erreur ( java.rmi.UnknownHostException )

    Comment puis-je "écraser" ou définir mon hostname? ( J'ai regardé dans la classe System mais je n'ai rien vu d'intéressant.....

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Le hostname est défini dans le fichier hosts. Celui-ci se trouve à cet endroit C:\windows\system32\hosts (ou un autre chemin, si tu as installé windows dans un autre répertoire) ou à celui-ci /etc/hosts selon ton système.

    ATTENTION : NE MODIFIE RIEN ! Fais seulement des ajouts dans ce fichier. Tu risques sinon de faire quelques bêtises

  5. #5
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    Peut tu expliquer un petit peu?

    Je ne connait absolument pas la structure des fichiers dont tu parle.
    De plus, je travaille sous windows ( pour l'instant ) mais mon programme doit aussi tourner sous un serveur Linux!

    De plus, est ce que l'utilisateur va vraiment apprécier que je modifie ça?
    Ne risque-t-il par d'y avoir des bugs à cause des protections? ( par exemple, un OS qui refuserait qu'un programme sans autorisation spécifique modifie un fichier comme celui-ci)?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Mouais, j'aurais mieux fait de me taire...

    Mais bon, on continue : le fichier hosts définit tous les noms d'hôte auxquels ton ordi peut répondre comme ça, si on l'appelle lui avec son IP. Il est recommandé de ne pas trop toucher à ce fichier, sauf si l'on sait ce que l'on fait.

    un fichier hosts est typiquement de la forme
    127.0.0.1 LOCALHOST
    127.0.0.1 ELVERION,DOMAINE2,DOMAINE3
    192.168.3.65 ELVERION_HOST
    192.168.3.1 MON_ROUTEUR

    Il permet d'associer à un nom une adresse IP. C'est comme un serveur DNS, mais en moins flexible, en moins utilisable. Traduit grossièrement, ce fichier signifie que ton ordinateur peut être appelé depuis plusieurs noms : localhost, elverion, domaine2, domaine3. Si tu appelles ELVERION_HOST depuis ton ordinateur, il cherchera sur le réseau l'ordinateur avec l'adresse 192.168.3.65, que celle-ci soit ton adresse ou celle d'un autre ordi.

    Mais comme je l'ai dit, j'aurais mieux fait de me taire, car j'ai mal compris ton besoin.

    Dans ton cas, tu ferais mieux d'utiliser un serveur DNS qui permet d'avoir un équivalent à ce fichier, mais pour un réseau complet, plutôt que pour un seul ordinateur. Dans tous les cas, ne _modifie_ pas ce fichier sur l'ordi du client. Sur le tien pour les tests, les développements, pourquoi pas, mais PAS si l'appli doit être déployée.

    Idéalement, tu donnes un nom de machine sur lequel se trouve la partie serveur de ton application. Pour les tests, il s'avère que c'est ta machine, mais pour la production, ce sera peut-être monserveur.masociete.ext (le DNS, bien configuré, renverra la bonne adresse IP vers le bon serveur) . Et comme ça, tu pourras te connecter au serveur RMI sans problème.

    Renseigne-toi donc sur les serveurs DNS. Souvent, ils existent dans les routeurs (pas dans le bas de gamme, toutefois).

  7. #7
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    J'avoue que j'ai un peu de mal à suivre.
    D'accord pour le DNS mais déja, où le placer? ( doit-je créer un fichier hosts dans les répertoires de mon programme? dans le système? )

    Ensuite, comment l'utiliser? ( comment lancer, par exemple, la commande pour chercher un hostname sur le réseau depuis mon appli java? )

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Un petit tour sur Wikipédia t'éclairera sans doute mieux que mes explications.

    En gros, oublie tout ce que j'ai dit sur le fichier hosts. DNS fera ce que tu désires

  9. #9
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    Merci beaucoup!

    J'ai lu l'article sur Wikipedia ( très intéressant ) mais je n'ai pas trouvé d'exemple concret de création de DNS sur internet....
    A tu un lien ou un exemple?

    Sinon une autre question, pour le java : il me donne une erreur si je n'indique pas le rmi://ELVERION/nom_de_l'objet dans le rebind(). Il refus que je l'appelle rmi:nom_de_l'objet ou rmi://truc/nom_de_l'objet...

    Est ce que je peut forcer java?

  10. #10
    Membre éprouvé
    Inscrit en
    Janvier 2006
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 161
    Par défaut
    ne serait-ce pas plus simple et raisonnable de mettre le nom d'hôte du serveur dans un fichier de configuration et de lire ce fichier de configuration depuis ton application pour avoir le bon nom d'hôte ?

    car je ne vois pas trop comment un client pourrait accéder à un serveur sans nom d'hôte, sans adresse ip, ou sans identifiant de quelque sorte que ce soit...

    PS : je peux, tu peux, il peut, nous pouvons, vous pouvez, ils peuvent.

  11. #11
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    Alors si l'on part de cette possibilité, comment le client peut il lire un fichier sur une machine qu'il ne connait pas et comment puis-je faire en sorte que le nom d'hôte se trouve dans mon rebind?

    J'y ai déjà pensé mais sans aboutissement...

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Transmets le fichier de config avec l'appli

  13. #13
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    A Dingoth :

    Si tu veut dire le fichier Serveur de mon appli en java, il fait 330 lignes donc je pense pas que ce soit gérable.

    Mais en voici quelques lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    JoueurMImpl jm2 = (JoueurMImpl) tmpJ.get(1);
    con.rebind("rmi://ELVERION/jm2", jm2);
     
    ja1 = (JoueurAImpl) tmpJ.get(2);
    con.rebind("rmi://ELVERION/ja1", ja1);
     
    ja2 = (JoueurAImpl) tmpJ.get(3);
    con.rebind("rmi://ELVERION/ja2", ja2);
    ELVERION est mon Hostname. Le problème auquel je me heurte, est que si je ne met pas ELVERION dans le rebind(), l'exécution me donne une erreur de connection et le programme s'arrète au premier rebind().

    Je suis donc forcé de mettre le Hostname ( coté serveur, ça ne pose pas trop de problème vu que je peut récupérer le hostname par une inetAddress ) dans le rebind().

    Mais le client, n'a aucun moyen de récupérer le hostname du serveur sans le connaitre! Or mon client doit bien se connecter au serveur pour qu'il puisse appliquer les lookup()....

  14. #14
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Comme déjà dit, rien n'est magique. Tu dois obligatoirement, à un moment donné, transmettre une adresse IP ou un nom de machine à ton client pour connaitre le serveur. Il n'est pas possible de lancer le client en lui disant : "débrouille-toi pour te connecter au serveur".
    Tu cherches manifestement à créer un jeu multi-joueurs. Alors regarde les techniques employées pour les jeux : le premier créé un serveur et donne son adresse à tous les autres joueurs qui veulent se connecter. Tu peux faire des essais de broadcast, mais selon le réseau ou sera installé ton appli, ça ne marchera pas toujours...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  15. #15
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    En effet, nous développons un jeu en multi-joueurs.

    Mais le serveur ne connait pas le client non plus, donc comment faire en sorte que le serveur envoi son hostname à des clients qu'il ne connait pas?

    Si on le fait en broadcast, n'y a-t-il pas de risque qu'un PC étant à la fois en local ( RJ45 avec son ami à coté ) et en internet envoie des données à TOUT les PC?

  16. #16
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Elverion Voir le message
    Mais le serveur ne connait pas le client non plus,
    Oui, ça arrive souvent aux serveurs
    donc comment faire en sorte que le serveur envoi son hostname à des clients qu'il ne connait pas?
    Ouhlala... le serveur n'envoit rien à personne tant qu'aucun client n'est connecté, sinon le serveur se transforme en client et se connecte au client qui devient serveur, et on tourne en rond parce que les clients ne connaissent pas le serveur et inversement

    Si on le fait en broadcast, n'y a-t-il pas de risque qu'un PC étant à la fois en local ( RJ45 avec son ami à coté ) et en internet envoie des données à TOUT les PC?
    Le broadcast est envoyé sur une seule interface réseau. Mais c'est une mauvaise idée. Qu'est-ce qui te gêne dans le fait de renseigner l'adresse IP ou un nom de machine sur le client ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  17. #17
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Je crois que tu devrais relire les cours de réseau. Il y a certaines lacunes dans ton raisonnement.

    Pour faire simple :
    * Tu as deux packages. L'un contient la partie cliente, l'autre la partie serveur.
    * Ta partie serveur est déployée sur un serveur QUE TU CONNAIS.
    * Ta partie client a un fichier de configuration (voir java.util.Properties).
    * Ce fichier de configuration contient le nom du serveur QUE TU CONNAIS.
    * Lorsque tu veux te connecter à RMI, tu utilises ce fichier de configuration pour trouver le bon serveur !

  18. #18
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    Pardonnez mes lacunes en réseau, notre prof se contente de lire des polycopiés et ne nous explique rien du tout!!

    Dingoth peut tu m'en dire un peu plus sur les Properties?
    ( je sais qu'ils contiennent le nom de la machine sur laquelle tu travaille mais je n'arrive pas a comprendre comment le client peut avoir le nom du serveur, ce qui simplifierait grandement mon problème )..

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Tu crées ton propres fichier de configuration. Dedans, tu écris le nom de ton serveur.

    Voilà, comme ça, pas sujet à interprétation...

    un simple fichier configuration.properties contenant ceci fera l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rmi.host = MON_SERVEUR_A_MOI
    Tu lis bien la doc de java.util.Properties, tu fais ce qu'il faut et ensuite, magie !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    con.rebind("rmi://"+properties.get("rmi.host")+"/jm2", jm2);

  20. #20
    Membre éprouvé
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Par défaut
    A quoi correspond ta variable properties?
    ( J'ai essayé ne serait que d'afficher le rmi.host par défault mais sans succès.. )

    Après des essais, j'ai reussi à le faire marcher sur un petit test.
    Je vais essayer de l'implanter sur mon gros programme.

    Merci beaucoup à tous!!!
    Je retransmettrait le résultat

Discussions similaires

  1. [RMI] exécution un programme utilisant RMI
    Par haha100 dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 28/11/2010, 23h19
  2. RMI: Client-Serveur Serveur-Client
    Par LinuxUser dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 13/04/2008, 18h28
  3. Assembly utilisable coté serveur et client
    Par anthyme dans le forum Silverlight
    Réponses: 12
    Dernier message: 29/03/2008, 20h08
  4. RMI (sens serveur client)
    Par kanzarih dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/10/2007, 12h42
  5. Programmation d'une application Client/Serveur
    Par altivex11 dans le forum C#
    Réponses: 9
    Dernier message: 30/08/2007, 09h33

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