Netty - Comment obtenir la réponse du serveur dans le client
Je suis surtout là avec Netty, mais un concept en est encore allusion à moi, et je ne peux pas trouver quelque chose dans les tutoriels et ainsi de suite. Tout d'abord, je ne comprends que Netty est asynchrone, mais il doit y avoir un moyen pour qu'un client appelle le serveur et être en mesure d'obtenir une réponse au-delà de la gestionnaire. Laissez-moi vous expliquer plus.
J'ai un client comme illustré ci-dessous. Et s'il vous plaît noter que je comprends il est amorcé et qu'une nouvelle connexion est établie à chaque appel, c'est juste là pour rendre l'exemple plus petits et plus concis. S'il vous plaît ignorer ce fait.
Client.java
//ServerResponse is a result from the server, in this case
//a list of users of the system (ignore that each time it's all bootstrapped).
public User[] callServerForInformationFromGUIWidget()
{
ClientBootstrap bootstrap = new ClientBootstrap(...);
bootstrap.setPipelineFactory(...);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
Channel channel = future.awaitUninterruptibly().getChannel();
//Where request is a POJO sent to the server,
//with a request such as get me a list of users
RequestPojo request = new RequestPojo(requestUserListCommand);
ChannelFuture lastWriteFuture = channel.write(request);
if(lastWriteFuture != null)
lastWriteFuture.awaitUninterruptibly();
}
Maintenant, je comprends comment obtenir les données sur le serveur, et le feu de retour à la raison. La seule chose est de savoir comment dois-je traiter sur le côté client? Oui le clientHandler classe peut faire quelque chose comme ce qui suit:
ClientHandler.java
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
User[] users = (User[])e.getMessage();
}
Le problème est comment le code client en fait obtenir ce résultat? Tous les exemples sont similaires à un service de chat, où l'événement déclenche quelque chose d'autre sur le client qui n'est pas en attente d'une réponse. Même le client http exemple, j'ai constaté ce manque. La documentation d'ensemble est vraiment bon, mais il en manque sur la façon de faire des rappels. De toute façon, dans ce cas j'ai besoin le client pour obtenir la réponse du serveur, et sur la base des résultats, il va faire ce dont il a besoin.
En d'autres termes, comment dois-je écrire le client à faire quelque chose comme ceci:
IdealClient.java
//ServerResponse is a result from the server, in this case
//a list of users of the system.
public User[] callServerForInformationFromGUIWidget()
{
...
RequestPojo request = new RequestPojo(requestUserListCommand);
ChannelFuture lastWriteFuture = channel.write(request);
if(lastWriteFuture != null)
lastWriteFuture.awaitUninterruptibly();
User[] users = resultFromCallToServer();
performSomeAction(users);
}
Parce que le gestionnaire ne sait pas qui est à la recherche de la réponse, ou qui a posé la question. Et si c'est fait dans le gestionnaire, que comment?
Retour à mes commentaires sur les exemples, le client http (et gestionnaire) exemples viens de vider le résultat du Système.. Si vous aviez une interface graphique, comment voulez-vous transmettre le résultat de votre demande jusqu'à l'interface graphique? Je n'ai jamais vu des exemples de cette.
OriginalL'auteur Stephane Grenier | 2012-01-28
Vous devez vous connecter pour publier un commentaire.
Jestan est correct. Dans mon cas, j'ai un client qui a besoin de processus de prix données de tiques. J'utilise Antlr pour l'analyse. Je tire mes événements dans mon parser, mais dans mon cas, mon protocole est une Chaîne de caractère en fonction. Ci-dessous est un exemple sans Antlr, je passe le message de la Chaîne dans votre cas, il pourrait être des utilisateurs.
OriginalL'auteur barnardh
Vous avez à gérer cela dans le Gestionnaire avec messageReceived(). Je ne suis pas sûr de ce que votre problème est exactement. Ma conjecture est que vous avez une réponse à une demande qui change en fonction de ce que la demande a été faite? Peut-être une description concrète de la chose que vous faites d'une réponse qui doit savoir ce que demande d'où elle vient. Une chose que vous pourriez être en mesure de faire est de passer un long objet vivant le gestionnaire qui sait la demande en suspens, et il peut correspondre à la réponse au moment où il la reçoit. Le pipeline d'usine méthode peut passer une référence à un type de gestionnaire d'objet pour le Gestionnaire.
C'est à peu près ce que j'essayais de dire. Votre Gestionnaire est créé dans le PipelineFactory qui est facile de passer des paramètres au Gestionnaire de là:
Lorsque vous créez votre portefeuille vous allez ajouter votre Gestionnaire d'une nouvelle connexion. Simplement passer un ou plusieurs objets qui lui permet de communiquer avec l'INTERFACE utilisateur ou d'un contrôleur.
Pour ajouter, parce que le JButton gestionnaire peut afficher le résultat dans le JTextArea, il sera peut-être un JDialog, etc.
Vous souhaitez utiliser les callbacks(auditeurs) à traiter les réponses, comme hotpottao asych mode hotpotato.biasedbit.com, (qui est aussi utilise Netty), alors vous avez à gérer qu'à l'intérieur de la messageReceived 🙂 , je pense que ce genre de rappels ne sont pas fournis par défaut parce qu'ils sont plus spécifiques au protocole/quelle application ?
Modifié ma réponse avec un code pour essayer d'expliquer ce que je voulais dire dans ma réponse originale à cette question. J'aurais un contrôleur qui peut mettre à jour mon INTERFACE utilisateur de la façon dont il l'entend, et passer que pour le Gestionnaire. Je ne voudrais pas passer individu éléments de l'INTERFACE utilisateur directement au Gestionnaire parce que c'est trop de couplage entre mon réseau de bas niveau et les composants d'INTERFACE utilisateur-je choisir d'utiliser.
C'est la partie qui me manquait. Je n'ai pas compris ce que tu voulais dire par: "Une chose que vous pourriez être en mesure de faire est de passer un long objet vivant le gestionnaire qui sait la demande en suspens, et il peut correspondre à la réponse au moment où il la reçoit. Le pipeline d'usine méthode peut passer une référence à un type de gestionnaire d'objet pour le Gestionnaire." Rétrospectivement, maintenant que je l'obtiens, il fait beaucoup de sens, mais en essayant de l'obtenir sans voir le code ou l'apprentissage du cadre, bien malheureusement, il était trop difficile à déchiffrer.
OriginalL'auteur chubbsondubs