Netty客户端,如何从发送到服务器的请求中获取响应

时间:2011-12-13 17:03:01

标签: netty

我正在尝试拼凑一个Netty客户端。我需要向服务器发送请求(我无法控制),我期待回复。

我不确定如何得到回复。

所以,如果我有:

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

如何从响应ChannelFuture中获取响应数据?我是否需要在Bootstrap管道中添加ChannelHandler?如果是这样,我如何将响应与请求相关联?

谢谢,

2 个答案:

答案 0 :(得分:2)

是的,您需要添加ChannelHandler。在您的情况下,最简单的方法是扩展SimpleChannelUpstreamHandler并覆盖channelConnected(…)方法和messageReceived(…)方法。在channelConnected中,您可以启动Channel.write(…)并在messageReceived中收到回复。如果响应的顺序不同,则需要编写自己的处理代码。

另一种解决方案是在调用write之前向管道添加SimpleChannelUpstreamHandler。像这样:

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

答案 1 :(得分:2)

首先,您可以参考本地时间的示例。在" LocalTimeClientHandler"的处理程序中,您可以找到阻止请求/响应的技巧。

但这仍然是一个'#34; hello world"展示项目,所以我们还需要考虑两个问题:

  1. 此示例中的想法是发送一次批处理并返回一次响应。所以它不适合通过重复使用同一频道连续发送的制作模式。

  2. 如果你想发送请求并尽快回复正确的响应,你需要稍微重构一下队列,否则性能真的很差。