- RMI et les MAJ d'objets [Java ] - Programmation
Marsh Posté le 12-02-2002 à 00:37:33
il suffit que tu utilises le pattern listeneur.
le principe c'est que tu as un objet qui gère une liste d'objet qu'il devra prenévenir dans le cas où il arrive un évenement.
lorsque ton client se connecte, il faut qu'il envoie la référence d'un objet que le serveur stockera dans une liste.
Lorsque le serveur reçoit la connection d'un nouveau joueur, il préviendra les autres joueurs en appelant une méthode sur chaqu'un des objets de la liste en question (en passant en paramètre le nom de chaque joueur par exemple).
c'est ce que tu voulais savoir ?
Marsh Posté le 12-02-2002 à 07:19:10
Très exactement ! C'est encore un peu confus dans ma tête, mais je vais chercher dans la direction Pattern Listener et je vais voir ce que je trouve tout seul. Si j'échoue, et bien...
Encore merci benou.
Marsh Posté le 12-02-2002 à 10:49:46
Plus clairement tu peux définir une interface comme ca
Code :
|
ensuite tes clients implémente cette interface (par exemple l'objet MyCallback. On peut ensuite imaginer que ta méthode connect sur ton serveur à l'allure suivante:
Code :
|
[jfdsdjhfuetppo]--Message édité par darklord22--[/jfdsdjhfuetppo]
Marsh Posté le 12-02-2002 à 11:53:51
darklord22 a écrit a écrit : Plus clairement |
ca veut dire quoi ca ???
Marsh Posté le 12-02-2002 à 11:55:25
benou a écrit a écrit : ca veut dire quoi ca ??? |
ro la la je donnais juste un exemple parce que le callback c'est pas toujours si évident à comprendre c'est tout
Marsh Posté le 12-02-2002 à 20:44:23
darklord22 a écrit a écrit : ro la la je donnais juste un exemple parce que le callback c'est pas toujours si évident à comprendre c'est tout |
Très juste, d'autant que j'avais pris l'info de benou au premier degré, du coup j'suis allé voir comme un dingue sur le net et dans mes bouquins ce que c'était que "pattern listener" . J'ai pensé que c'était une sorte de Listener en Java et j'ai bien galéré...
Donc là je rentre du boulot, je vois le squelette de code que tu me pond. Au début je me dit en voyant interface qu'il va falloir faire du client/serveur dans les deux sens ; puis en éxaminant mieux : public void updateClientList(Client[] clients);
En somme tu veux que le client agisse sur les autres clients directement. C'est ça ? Dans ce cas, ben... je sais pas trop comment récupérer les références à moins de les passer au serveur. Donc si je ne me trompe pas au final, tout nouveau client gagne une référence sur les clients connectés précedemment. Dis-moi si je me trompe !
Par contre et ça peut paraître idiot mais j'ai pas tout compris sur la méthode : public void connect(ClientCallback callback, //autres params). Celle-ci est bien une méthode destinée à être implémentée sur le client, pas sur le serveur, et je passerai this en tant que ClientCallback (du moins le client courant)...
A que c'est compliqué quand on débute !
Marsh Posté le 12-02-2002 à 21:03:33
non ce n'est pas ca et je n'ai plus le temps pour t'expliquer. Demain matin je posterai si ben est pas passé....
Marsh Posté le 12-02-2002 à 22:09:59
darklord22 a écrit a écrit : non ce n'est pas ca et je n'ai plus le temps pour t'expliquer. Demain matin je posterai si ben est pas passé.... |
Je suis désolé... J'ai honte. Enfin merci en tous cas.
Marsh Posté le 12-02-2002 à 23:59:25
bon, je vais essayé d'être plus clair ce coup-ci....
déjà le patern que j'appelait Listener, c'est aps son vrai nom. Le paterne s'appelle "Obervé-Observer". Tu pourras d'ailleur trouvé un semblant d'implémentation dans le package java.util. Ce patern là est beaucoup utilisé dans Swing pour les evénements : un composant peux générer des évenement, et d'autres objets s'abonnent (grâce aux listeners) à ce composant pour resevoir les évenement générés.
mais bon. C'ets pas ton problème, donc je passe ...
Résumons. Tu veux que tes clients recçoivent la liste des autres joueurs connectés au serveur, et que celles-ci se mette à jour lorsqu'un nouveau joueur se connecte.
Dans ce problème, l'objet Observé est le serveur, qui contient la liste des clients. Les clients sont les observeurs : ils observent une modification du serveur (un nouveau joueur se connecte).
Pour être au courant des évenements du serveur, les clients vont devoir s'abonner au serveur. Il faut donc qu'il y ait une méthode d'abonnement sur ton objet serveur, et que le serveur gère une liste des clients abonnés. :
Code :
|
remarque : pour faire propre il faudrait aussi gérer les désabonnement, mais bon ...
On va dire que ton Client possède une méthode qui lui permet de remettre jour la liste des joueur connectés :
Code :
|
ce qu'il suffit ensuite de faire c'est que lorsque le Serveur reçoit une nouvelle connection d'un de tes clients, il met à jour sa liste interne de joueurs puis la diffuse à tous les clients abonnés.
Code :
|
voila c'est tout.
En pratique, ce n'est pas l'objet Client qu'on abonne au serveur, mais un sous-objet dont le rôle et de reservoir les évenement (Le listener : écouteur d'évenement). Ce listener à une interface bien définie dans laquelle chaque méthode correspond à un évenement particulier. Cette méthode sera appelée lorsque l'évenement en questiona ura étét déclenché. Pour des raisons pratique, on passe habituellement en paramètre de ces méthodes des informations sur l'évenement (ici la liste des joueurs). Ca évite d'avoir à redemander l'info au serveur.
Maintenant, si on parle RMI, il faut que l'objet Listener (celui qui tu envoies au serveur pour l'abonner) soit un PortableRemote Object (si je me souviens bien, c'est ca les objets intérrogeable à distance), ainsi que ton serveur. Les paramètres des méthodes de ton Listener devront être Serializable pour pouvoir être transférés via le réseau.
voila. J'espère que je me suis mieux fait comprendre ce coup-ci. J'ai un gros effort pour être clair !
PS : le vrai design-patern observé-observeur est (à peine) plus compliqué que ca ...
Marsh Posté le 13-02-2002 à 08:53:16
Merci benou... Là c'est super clair. Juste un dernier avant d'implémenter : en RMI, il me semblait qu'on passait les objets par valeurs, autrement dit quand tu fais "clientsAbonnes.add(client)", tu copies l'objet dans la liste que maintient le serveur. Ce qui fait que le serveur ne retrouve pas le client ? Je sais que j'ai tort, mais je veux être sûr. Est-ce que cette possibilité par rapport à Remote est du fait que tu utilises PortableRemote ?
Marsh Posté le 13-02-2002 à 09:46:58
Cherrytree a écrit a écrit : Merci benou... Là c'est super clair. Juste un dernier avant d'implémenter : en RMI, il me semblait qu'on passait les objets par valeurs, autrement dit quand tu fais "clientsAbonnes.add(client)", tu copies l'objet dans la liste que maintient le serveur. Ce qui fait que le serveur ne retrouve pas le client ? Je sais que j'ai tort, mais je veux être sûr. Est-ce que cette possibilité par rapport à Remote est du fait que tu utilises PortableRemote ? |
il n'y a que les types primaires qui sont passés par valeur en RMI. Les interfaces et compagnie sont passées par référence.
Marsh Posté le 13-02-2002 à 09:56:11
ReplyMarsh Posté le 13-02-2002 à 10:44:02
si je me souviens bien, il faut que tes objets héritent de PortableRemoteObject pour ca, nan ? c'est pas automatique ...
(je me souviens plus bien, j'ai pas fais bcp de RMI)
petite précision : il n'y a que les types primaires ET les objets sérializables qui sont passés par valeur
Marsh Posté le 13-02-2002 à 11:41:21
benou a écrit a écrit : si je me souviens bien, il faut que tes objets héritent de PortableRemoteObject pour ca, nan ? c'est pas automatique ... (je me souviens plus bien, j'ai pas fais bcp de RMI) petite précision : il n'y a que les types primaires ET les objets sérializables qui sont passés par valeur |
Y'm semblait aussi que les types primaires n'étaient pas les seuls. Pour les PortableRemote, j'ai aucun bouquin qui en parle (je crois, je suis pas à la maison).
Marsh Posté le 13-02-2002 à 14:11:47
y a un reflexe à avoir : question en Java --> Thinking in Java
regarde la : http://penserenjava.free.fr/pens/i [...] htm#07.040
il faut que ton objet hérite de UnicastRemoteObject et implémente une interface qui étend Remote.
enfin, tu trouveras tous les détails avec le lien !
Marsh Posté le 13-02-2002 à 14:21:05
Je sens que je vais apprendre ce bouquin par coeur. Encore merci.
Marsh Posté le 13-02-2002 à 14:23:42
Cherrytree a écrit a écrit : Je sens que je vais apprendre ce bouquin par coeur. Encore merci. |
sincérement, si tu prends le temps (c'est long) ca vaut vraiment le coup !!!
tu apprendras le java, abordera tout ce qui se rapporte au Java (rmi, ejb, jni, servlet, jsp, corba, ...) et tu auras surtout une excellente vision d'une bonne programation objet.
un must !
Marsh Posté le 11-02-2002 à 23:43:46
Bon, voilà le truc : je cherche à créer un Pong en réseau. J'ai choisi d'utiliser RMI pour mettre des objets en partage. Pour l'instant je cherche à écrire un module de connection pour les joueurs. Chaque joueur ouvre une appli PongClient clique sur Join et ajoute son nom à la liste puis "launch". On lance aussi un PongServer qui crée l'objet distant RemoteList. Tout ça j'y arrive. Maintenant ce que je voudrais faire et je n'y arrive pas, c'est gérer le fait que lorsqu'un joueur fait "launch" ça réactualise les listes dans les menus Join des autres PongClient.
[jfdsdjhfuetppo]--Message édité par Cherrytree--[/jfdsdjhfuetppo]
---------------
Le site de ma maman