[Java]RMI

Résolu/Fermé
reltak Messages postés 260 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 14 janvier 2012 - 19 mai 2009 à 12:02
 fithwith - 26 févr. 2010 à 14:34
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.
A voir également:

9 réponses

sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
19 mai 2009 à 14:07
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?

++
4
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
19 mai 2009 à 12:16
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?

++
1
reltak Messages postés 260 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 14 janvier 2012 41
19 mai 2009 à 12:44
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.
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
19 mai 2009 à 12:54
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.

++
0
reltak Messages postés 260 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 14 janvier 2012 41
19 mai 2009 à 13:03
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
19 mai 2009 à 13:15
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)

++
0
reltak Messages postés 260 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 14 janvier 2012 41
19 mai 2009 à 13:38
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.
0
reltak Messages postés 260 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 14 janvier 2012 41
19 mai 2009 à 14:15
ouii merci beaucoup de ta patience c'est beaucoup plus clair ;)

bon après-midi
Reltak.
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
19 mai 2009 à 14:16
Ciao, bon après-midi à toi aussi :-)
0
salut,
dsl de réveillé ce sujet mort et enterrer, mais cette solution ca s'apel pas du multicast??

c'est possible ca avec rmi, d'après ce qu'on étudie dans les livre le stub ne peux fournir qu'une reference vers un objet distant hors dans ce cas ca veut dire que le serveur va manipuler un objet distant pour chaque client.
0