J'écris une petite application de discussion basée sur RMI.
L'idée est la suivante: le client se regagne sur le serveur, et chaque fois que le serveur reçoit un message d'un client, il appuie ce message à tous les autres clients.
Mais je reçois une notarializableException Bien que, l'objet, je passe comme un paramètre de méthode implémente l'interface distante. P>
Voici quelques codes:
(La partie problématique est le paramètre "Interface (ClientChat): p> (clientChat) implémentation: p> (preverchat) interface p> (ServerChat) Implémentation P> ce paramètre code> dans
ceci.chatserv.registriereclient (this); code> (implémentation clientChat)) p>
java.rmi.MarshalException: error marshalling arguments; nested exception is:
java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:156)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at $Proxy0.registriereClient(Unknown Source)
at de.XX.Chat.ChatClientImpl.<init>(ChatClientImpl.java:19)
at de.XX.Client.main(Client.java:49)
Caused by: java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:151)
... 5 more
3 Réponses :
Ce que vous pouvez faire est de configurer un objet de rappel. Ceci est celui qui étend unicastremoteObject et lorsque vous passez ceci, cela devient un rappel. P>
http://www.cs.swan.ac.uk.uk /~csneal/internetetComputing/rmichat.html P>
La télécommande n'est pas sérialisable. Vous ne pouvez pas passer un objet proxy de cette façon. Même si vous le faites sérialisable, il enverrait un copier em> de l'objet qui existerait sur le serveur. La copie de l'objet sur le client ne serait pas appelée. P>
Pour votre "serveur" pour envoyer des messages à votre "client", vous devez créer un service sur le "client" pour en faire un serveur. P>
Vous pouvez constater que l'utilisation d'une solution de messagerie telle que JMS est mieux adaptée à cette prise. Un serveur JMS propose des sujets que vous pouvez publier et vous abonner. Un serveur JMS simple à utiliser est actif MQ. P>
Donc, si je vous comprends bien, je ne peux pas passer un objet distant via un paramètre sur le serveur et laisser le serveur appeler d'autres méthodes sur cet objet réussi?
Vous pouvez, mais l'objet appelé sera sur le serveur. Vous ne pouvez pas avoir appeler le client du serveur de cette façon. Certains protocoles RPC soutiennent cela, mais je ne me suis pas souvenu qui (j'ai écrit un dans le passé;). Pour un serveur de discussion, JMS Thèmes est le moyen le plus simple de le faire.
Il n'est pas nécessaire de prolonger UnicastremoteObject code>: vous pouvez l'exporter manuellement.
Les objets passés sous forme de paramètres ou de résultats de méthodes distantes doivent être soit: p>
sérialisable (ou externalisable), ou p> li>
exportés em> objets distants. p> li>
ol>
Le vôtre n'est pas non plus. Cependant, car il implémente une interface distante, vous avez une intention (2).
Les objets qui étendent UnicastremoteObject code> sont automatiquement exportés en construction. Les objets qui ne doivent pas être exportés explicitement, via
UnicastremoteObject.exportObject () code>. P>
On dirait que vous avez peut-être oublié de "étendre UnicastremoteObject" sur les implémentations de l'interface: et p>