Я в основном работаю с 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. Если бы у вас был графический интерфейс, как бы вы передали результат запроса в графический интерфейс? Я никогда не видел примеров для этого.