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 :

Java RMI Callback


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut Java RMI Callback
    Bonjour,

    J’utilise la technologie RMI sur des PC distants. En réalité, pour le moment, j’ai un PC qui fait office de serveur et 6 autres PC qui font office de client.
    Pour le moment, tout fonctionne bien puisque je ne fais qu’envoyer des 'demandes' dans le sens client -> serveur.
    Un peu de code.
    Mes clients :
    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
     
     public void init() {
          // Mise en place du Security Manager 
          if (System.getSecurityManager() == null) {
               System.setSecurityManager(new SecurityManager());
          }
     
          try {
          // Récupération des propriétés du RMI
          remote = Naming.lookup("rmi://" +"192.168.1.100"+ "/InformationRMI");
          } catch (MalformedURLException e) {
              e.printStackTrace();
          } catch (RemoteException e) {
              e.printStackTrace();
          } catch (NotBoundException e) {
              e.printStackTrace();
          }
    }
    Mon serveur :
    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
     
    public void init() {
            try {
                // Mise en place du Security Manager 
                if (System.getSecurityManager() == null) {
                    System.setSecurityManager(new SecurityManager());
                }
     
                // Permet de démarrer automatiquement le rmiregistry
                LocateRegistry.createRegistry(1099);
     
                Information informationImpl = new InformationImpl();
     
                String url = "rmi://" +"192.168.1.100"+ "/InformationRMI";
                // Enregistrement de l'objet avec l'url
                Naming.rebind(url, informationImpl);
     
            } catch (RemoteException e) {
                e.printStackTrace();
            } 
            catch (UnknownHostException e) {
                e.printStackTrace();
            }
            catch (MalformedURLException e) {
                e.printStackTrace();
           }
    }
    Maintenant, je voudrais pouvoir envoyer un message à mes PC client. Mais là, je coince.
    Pour être plus clair, je souhaite afficher un texte sur les écrans des PC client. Une difficulté s’ajoute car je veux pouvoir envoyer un texte à un PC client bien précis et pas à tout les PC client à la fois.

    Après quelques recherches sur le net, je pense devoir m’orienter vers la procédure ‘callback’ (bien que dans mon cas, je ne réponds pas à un appel d'un client), mais je ne vois pas comment faire.
    - Comment récupérer les adresses IP de mes clients ;
    - Comment faire au niveau du serveur pour renvoyer un texte (String) à un client --> car ma classe 'InformationImpl' implémentant l'interface Information n'est pas codée dans mon serveur);


    Quelqu’un peut-il m’aider ?

    Merci d’avance.

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Les rôles s'inversent dans ce cas là... Celui qui initie une communication est toujours un client.

    En HTTP/1.1, il y a la notion de connexion persistante qui permet d'implémenter des comportement de "push": le serveur pousse des informations vers un client en donnant l'impression que les rôles sont inversés et que le serveur contacte lui-même les clients, mais ce n'est qu'une illusion (c'est toujours le client qui a envoyé la première demande). Par contre en RMI (donc, TCP pur et dur), rien de tout ça.

    Si c'est possible, passer sur quelque chose de plus moderne. RMI c'est très vieux et désuet. Aujourd'hui, on passe plutôt par du rest over http (et donc le push est facile à faire).

    Même si tu implémentais des comportements de serveur sur ton client (avec un port d'écoute tcp, etc.) ce serait une galère au niveau de la sécurité et de la maintenabilité.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Merci pour ton aide mais mon application n'est pas en Web mais standalone. C'est pour ça que j'utilise RMI.
    Si on peut tjrs m'aider ... ?

  4. #4
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 325
    Points : 3 769
    Points
    3 769
    Billets dans le blog
    12
    Par défaut
    Salut,

    RMI respecte une architecture SOA (Service Oriented Architecture), tu as un client qui initie la communication puis le serveur qui répond.
    D'après ta description, ton besoin est de pouvoir notifier des clients, c'est-à-dire que le serveur initie la communication.

    Tu as plusieurs solutions techniques plus ou moins bonnes (voir pas bonne du tout) :
    • Avec JMS, ton serveur RMI peut envoyer un message dans une file JMS qui sera récupéré par un client ou un groupe de clients lorsqu'ils seront connectés. C'est un système de push que beaucoup pourront te conseiller.
    • Avec du Multicast (solution custom), tes clients et serveur peuvent envoyer des messages dans les deux sens (cf: projet perso multicast-wrapper). Ça inclue un système de découverte et présente l'avantage d'être rapide (udp), mais la taille de tes paquets sont limités, tu n'es pas sûr à 100% qu'un paquet sera réceptionné, les paquets peuvent aussi être réceptionnés dans le désordre.
    • Avec une solution RMI 100% custom où le serveur est aussi client RMI, le client envoie lors d'un premier appel son identifiant et son IP (pour que le serveur s'en serve comme client RMI), bien sûr si tu souhaites mettre en place une sécurité avec une authentification ce sera au serveur de générer un token. Bref c'est une possibilité technique que je te déconseille, RMI n'est pas fait pour ça.


    A+

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Merci pour ton info Gugelhupf, ça m'a appris des choses que je ne connaissais pas. Mais ces '3 descriptions' ne servent qu'à envoyer/recevoir des messages. Moi, je souhaite utiliser des méthodes qui se situent sur les PC distants (la base de RMI, sinon, j'utiliserais des Sockets). Ce n'est pas un pgm de chat que je réalise.
    Je suis tjrs à l'écoute de toute aide.

    Merci.

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Bah du coup, même combat mais les rôles s'inversent: les implém sont sur les postes clients, qui font office de serveur. Et les Stubs sont sur le serveur, qui fait office de client.

    Par contre c'est vraiment naze niveau sécu...

    PS: Spring Remoting fournit une abstraction de plus haut niveau pour propager des appels de méthodes d'un client à un serveur. C'est peut-être un peu plus facile à mettre en place, et à maintenir...

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Merci Pill_S pour ton intervention mais le principe, je m'en doutais !
    Si je me permets de poser cette question sur le forum, c'est pour avoir un peu d'aide au niveau du code.

    Marc

  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Je comprend pas... Tu as déjà une communication en place pour la communication C -> S non?

    Bin tu reproduis la même chose dans l'autre sens...

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Donc, si je te comprends bien, je dois réimplémenter un serveur à tous mes clients actuels et réimplémenter un client où se situe mon serveur actuel !
    Je doute pour 2 raison.
    1. Le serveur doit être lancé avant le client. Et donc, dans le cas où j'ai un serveur sur mes 6 PC (voir mon premier message ci-dessus) 'qui font office de client actuellement', je lance quel(s) PC en premier ???
    2. D'après la documentation que j'ai lue sur le net concernant RMI callback, je dois pouvoir envoyer un message (où, dans mon cas, utiliser une méthode de mes clients) à mes clients sans devoir réimplémenter une infrastructure client/serveur.

    Mais, je t'ai peut être mal compris !

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    le RMI marche dans les deux sens en pratique, pour autant que les ports soient ouvert (et si ma mémoire est bonne). Du coté client tu implémente une classe, son interface et son stub, tu fournis tout ça au serveur. Coté serveur t'as du serveur RMI classique avec une méthode callMachin(Truc), Truc étendant RemoteInterface. Quand ton client appelle cette méthode sur le serveur, le serveur reçois un Stub qui permet de contre appeler les méthode de Truc sur la machine cliente.

    Comme déjà dit, c'est vraiment pas la gloriole coté sécurité.

  11. #11
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    En cherchant un peu, effectivement, RMI propose un système de callback, par contre, je n'ai jamais expérimenté donc je vais m'arrêter là...

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Et moi j'ai utilisé ça il y a presque 15 ans


    mes souvenirs vague sont
    'quand on passe un remoteobject comme paramètre / valeur de retour, c'est une référence vers un point d'accès qui est renovoyée, pas une copie de l'objet'
    'ça fonctionne très très mal avec le nat / les firewall'

Discussions similaires

  1. [Framework] [RMI] java.rmi.UnmarshalException
    Par YokoSop dans le forum Spring
    Réponses: 12
    Dernier message: 08/12/2010, 16h29
  2. Un probleme en Java RMI
    Par fouomene dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 12/01/2007, 15h38
  3. problème de java rmi
    Par helter_skelter dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2006, 15h56
  4. Erreur de connexion : java RMI & linux
    Par pedouille dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 16/05/2006, 21h04
  5. Problême de Socket avec un applet java (RMI/policy)
    Par Vesperal dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/04/2006, 13h00

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