Rechercher : dans
Par :

[Java]RMI

Dernière réponse le 19 mai 2009 à 14:16:53 reltak, le 19 mai 2009 à 12:02:07 
 Signaler ce message aux modérateurs

Bonjour,

Je développe beaucoup en Java et j'aimerais savoir s'il était possible d'utiliser le RMI pour développer une application de chat qui permettrait à plusieurs clients de communiquer ensemble.

Le protocole et le serveur ne me posent pas beaucoup de problèmes à part pour renvoyer un message au client.
Ex:
Toto envoie le message "Tata" à tout le monde. Le serveur récupère l'information via l'objet RMI qui est publié. Cependant comment je fais pour dire aux autres clients : "Hé ho! ya un nouveau message !" ??


J'ai juste besoin d'éclairage sur la question... j'ai déjà beaucoup questionné Google et je n'ai rien trouvé de convaincant.

Merci d'avance pour votre aide.
Reltak.

Configuration: Windows XP
Firefox 3.0.10

Meilleures réponses pour « [Java]RMI » dans :
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
Installer Java sous Ubuntu VoirPar défaut, Firefox n'est pas fourni avec Java. Voici comment procéder pour l'installer: Ouvrez un terminal (Menu Applications > Accessoires > Terminal) et tapez: sudo aptitude install sun-java6-jre sun-java6-plugin ou sudo aptitude install ...
[Logiciel libre] Installation firefox 2.0+java+flash VoirInstallation firefox 2.0+java+flash en ligne de commande A. INTRODUCTION B. INSTALLATION FIREFOX 1. Création d'environnement 2. Téléchargement et vérification de la signature 3. Installation de Firefox 4. Démarrage de l'application C....
Télécharger Java Runtime Environment VoirJava Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des personnes dans le monde entier, de calculer les intérêts de votre prêt immobilier ou de visualiser des images en 3D. Ces...
Introduction à RMI (Remote Method Invocation) VoirIntroduction à RMI RMI (Remote Method Invocation) est une API Java permettant de manipuler des objets distants (c'est-à-dire un objet instancié sur une autre machine virtuelle, éventuellement sur une autre machine du réseau) de manière...
Architecture de RMI (Remote Method Invocation) VoirArchitecture de RMI L'architecture de RMI est schématisée ci-dessous : Lorsqu'un objet instancié sur une machine cliente désire accèder à des méthodes d'un objet distant, il effectue les opérations suivantes : il localise l'objet distant grâce...
Java - Les types de données VoirLes primitives Java est un langage orienté objet, c'est-à-dire que les éléments manipulés sont des classes, ou plus exactement des objets, c'est-à-dire des instances de classes. Toutefois ces objets contiennent des données possèdant un type (et...

1

sandul, le 19 mai 2009 à 12:16:12

Salut,

Toto envoie le message "Tata" à tout le monde. Le serveur récupère l'information via l'objet RMI qui est publié. Cependant comment je fais pour dire aux autres clients : "Hé ho! ya un nouveau message !" ??

Pas bien claire, ta question.

Exemple: Toto envoie le message Tata à tout le monde <== directement ou en passant par le serveur? Si directement, c'est du RMI entre chaque poste client connecté à l'appli de chat et le serveur servirait uniquement pour amorcer le dialogue initial. Correct?

Peux-tu reformuler ta question en prenant soin de bien expliquer, please?

++

Répondre à sandul

2

reltak, le 19 mai 2009 à 12:44:03

Pardon je pensais être clair mais maintenant que tu le dis c'est vrai que c'est un peu ambigu...

alors
Je désire en fait avoir plusieurs clients qui se connectent à UN serveur. Je voudrais que toute communication passe par ce serveur, que ce soit échanges de messages, de fichiers, etc.

Grâce à l'objet RMI, je peux envoyer un message du client au serveur, mais je ne sais pas comment faire pour que le serveur avertisse les autres clients qu'un message a été envoyé.

Pour en revenir à mon exemple avec Toto

on a plusieurs connectés : Toto, Toto2, et Toto3.

Toto envoie le message : "Salut"
Le serveur reçoit le message "Salut" en provenance de "Toto"
Comment le serveur peut-il transmettre le message à Toto2 et Toto3 ??

J'espère que c'est plus clair ainsi.

Répondre à reltak

3

sandul, le 19 mai 2009 à 12:54:17

Vouich, bien plus clair à présent ;-)

Pas très compliqué à faire; une idée serait la suivante:

Chaque client de type Toto envoie au serveur une identification (IP + port) lors de son login initial et ouvre un listener RMI en attente sur le port en question (registry = LocateRegistry.createRegistry()... registry.rebind() ... Naming.rebind()...)

Maintenant, le serveur reçoit la demande de login de Toto1; si vérification user/password correcte, le serveur rajoute l'IP+port de Toto1 à une liste d'abonnés.

A chaque évenèment reçu de TotoX, le serveur notifie l'ensemble de ses abonnés en faisant une boucle sur les éléments de la liste.

Ce callback du serveur est très simple à faire si pas de NAT & un peu plus délicat à mettre en oeuvre en présence du NAT.

++

Répondre à sandul

4

reltak, le 19 mai 2009 à 13:03:05

Pour la liste d'abonnés et le protocole c'est bon.

"A chaque évenèment reçu de TotoX, le serveur notifie l'ensemble de ses abonnés en faisant une boucle sur les éléments de la liste. "

Par contre, j'arrive pas trop à convertir ton idée en code Java en fait :P
Je ne sais pas du tout comment le serveur peut notifier ses abonnés en fait.
Le système d'événement me paraît intéressant mais comment développer ça dans une appli client/serveur ?

Merci

Répondre à reltak

5

sandul, le 19 mai 2009 à 13:15:03

Chaque client lance un serveur RMI (le rmiregistry, en fait) lorsqu'il démarre et reste donc en attente des appels du serveur. C'est exactement comme ton code côté serveur, sauf que cette fois-ci c'est du côté client. Tu dois avoir donc une classe qui fait un extend de (par exemple) UnicastRemoteObject, qui implémente une interface et cette interface (disons InterfaceA), interface qui extends à son tour Remote.

Maintenant, du côté serveur, tu as 2 options pour la liste des abonnées:
- ou bien tu as une liste essentiellement de String (Ip et port) et à chaque fois tu fais un truc genre

InterfaceA clientProxy = (InterfaceA) Naming.lookup("rmi://blablabla");

- ou bien tu fais ce Naming tout au début et tu gardes dans ta liste des objets Remote

Dans le 2ème cas, il y aura un gain de perf (plus de Naming à faire), mais il sera contrebalancé par:
1. une gestion des erreurs (clients déconnectés)
2. une tite augmentation du trafic réseau pour la maintenance des connexions RMI (JAva le fait en background)

++

Répondre à sandul

6

reltak, le 19 mai 2009 à 13:38:34

Là je commence à être perdu... =P ca remet en cause ce que j'avais compris de RMI...

donc si je résume ce que tu me dis :

Il y a donc obligatoirement une interface sur le serveur : "IntServ" auquel les clients peuvent se connecter
Il y a une classe qui étend Remote et qui implémente IntServ : "ClassServ"

Et pour que mon serveur puisse notifier des messages aux clients il faut créer un équivalent côté client...
avec une interface "IntClient" et une classe "ClassClient" qui étend remote et qui implémente IntClient.
Et avec cette interface et cette classe je fais quoi ? Là je vois plus du tout :(
Et quid des événements ? Je vois bien comment ça fonctionne avec les interfaces graphiques, mais j'ai du mal à voir comment faire ça avec une appli client/serveur.

Merci de ta patience.
Reltak.

Répondre à reltak

7

sandul, le 19 mai 2009 à 14:07:06

Oui, pour ta description de ce qu'il y a à faire comme classes.

Et avec cette interface et cette classe je fais quoi ? <==
Exemple:

Supposons que l'interface client contient la méthode notifyClient(String). Côté serveur, dans la méthode que le client (Toto) appelle avec "Bonjour" comme paramètre, tu aurais qqchose du genre:

class ClassServ extends UnicastRemoteObject implements IntServ {
...
  public void sendMessage(String message) throws RemoteException {
    // traitement du message
    ...
    // notification des abonnés (supposons que la liste sur le serveur garde des objets Remote)
    // à entourer par des try .. catch etc.
    for (IntClient subscriber: subscribersList) {
       subscriber.notifyClient(message);
    }
  }
}
Est-ce un peu plus clair à présent?

++

Répondre à sandul

8

reltak, le 19 mai 2009 à 14:15:38

Ouii merci beaucoup de ta patience c'est beaucoup plus clair ;)

bon après-midi
Reltak.

Répondre à reltak

9

 sandul, le 19 mai 2009 à 14:16:53

Ciao, bon après-midi à toi aussi :-)

Répondre à sandul