Netty клиент, как получить ответ обратно на запрос, отправленный на сервер - PullRequest
5 голосов
/ 13 декабря 2011

Я пытаюсь собрать клиент Netty.Мне нужно отправить запрос на сервер (который я не контролирую), и я жду ответа обратно.

Я не совсем уверен, как получить ответ обратно.

Итак, если бы у меня было:

ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654));
Channel connector = future.awaitUninterruptibly().getChannel();
ChannelFuture response = connector.write(query);

Как мне получить данные ответа из ответа ChannelFuture?Нужно ли добавить ChannelHandler в конвейер начальной загрузки?Если да, то как мне связать ответ с запросом?

Спасибо,

Ответы [ 2 ]

2 голосов
/ 15 мая 2012

Во-первых, вы можете обратиться к образцу местного времени.В обработчике «LocalTimeClientHandler» вы можете найти способ блокирования запроса / ответа.

Но это все еще демонстрационный проект «Привет, мир», поэтому нам нужно рассмотреть еще 2 проблемы:

  1. Идея в этом примере состоит в том, чтобы отправить пакет один раз и получить ответ один раз.Таким образом, для производственного шаблона не подходит непрерывная отправка путем повторного использования одного и того же канала.

  2. Если вы хотите отправить запросы и получить правильные ответы как можно скорее при большой нагрузке, вынужно немного реорганизовать очередь, иначе производительность действительно плохая.

2 голосов
/ 15 декабря 2011

Да, вам нужно добавить ChannelHandler. Самый простой способ в вашем случае - расширить SimpleChannelUpstreamHandler и переписать метод channelConnected(…) и метод messageReceived(…). В channelConnected вы запускаете Channel.write(…), а в messageReceived вы получаете ответ. Если ответы могут приходить в другом порядке, то при записи необходимо написать собственный код обработки.

Другим решением было бы добавить SimpleChannelUpstreamHandler в конвейер перед вызовом write. Примерно так:

channel.getPipeline().addLast("yourHandlerName", new SimpleChannelUpstreamHandler()) {
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        // remove handler after receiving response
        ctx.getPipeline().remove(this);

         // do logic
         ...
      }
});
...