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