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