Netty - Как получить ответ сервера в клиенте

Я в основном работаю с Netty, но одна концепция все еще намекает на меня, и я ничего не могу найти в руководствах и т. Д. . Во-первых, я понимаю, что Netty асинхронна, но у клиента должен быть способ вызвать сервер и получить ответ за пределами обработчика. Позвольте мне объяснить подробнее.

У меня есть клиент, показанный ниже. И обратите внимание, что я понимаю, что он загружается, и при каждом вызове устанавливается новое соединение, это просто для того, чтобы пример был меньше и лаконичнее. Пожалуйста, проигнорируйте этот факт.

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();
}

Теперь я понимаю, как получить данные на сервере и вернуть результат. Единственное, как мне с этим справиться на стороне клиента? Да, класс clientHandler может делать что-то вроде следующего:

ClientHandler.java

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) 
{
    User[] users = (User[])e.getMessage();
}

Проблема в том, как на самом деле клиентский код получает такой результат? Все примеры похожи на службу чата, где событие запускает что-то еще на клиенте, который не ожидает ответа. Даже в примере с http-клиентом этого не было. В целом документация действительно хороша, но не хватает того, как выполнять обратные вызовы. В любом случае, в этом случае мне нужно, чтобы клиент получил ответ от сервера, и на основе результатов он сделает то, что ему нужно.

Другими словами, как мне написать клиента, чтобы он делал что-то вроде этого:

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);
}

Потому что обработчик не знает, кто ищет ответ или кто задал вопрос. А если в обработчике, то как?

Возвращаясь к моим комментариям о примерах, примеры http-клиента (и обработчика) просто выгружают результат в System.out. Если бы у вас был графический интерфейс, как бы вы передали результат запроса в графический интерфейс? Я никогда не видел примеров для этого.

10
задан Stephane Grenier 28 January 2012 в 21:25
поделиться