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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    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
    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 confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    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 326
    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 326
    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+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    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
    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...

Discussions similaires

  1. [Framework] [RMI] java.rmi.UnmarshalException
    Par YokoSop dans le forum Spring
    Réponses: 12
    Dernier message: 08/12/2010, 15h29
  2. Un probleme en Java RMI
    Par fouomene dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 12/01/2007, 14h38
  3. problème de java rmi
    Par helter_skelter dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2006, 14h56
  4. Erreur de connexion : java RMI & linux
    Par pedouille dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 16/05/2006, 20h04
  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, 12h00

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