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

5
我正在尝试组装一个Netty客户端。我需要向一个我无法控制的服务器发送请求,并期望得到响应。
我不太确定如何获得响应。
因此,如果我有:
ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654));
Channel connector = future.awaitUninterruptibly().getChannel();
ChannelFuture response = connector.write(query);

如何从响应的 ChannelFuture 中获取响应数据?是否需要将 ChannelHandler 添加到启动引导程序管道中?如果需要,如何将响应与请求关联起来?
谢谢。

你最终找到了问题的答案吗?因为我也有同样的问题... - Stephane Grenier
2个回答

2
首先,您可以参考localtime的示例。在“LocalTimeClientHandler”处理程序中,您可以找到阻止请求/响应的技巧。
但是,这仍然是一个"hello world"展示项目,因此我们还需要考虑两个问题:
1. 在该示例中的想法是一次发送一批数据,然后一次获取响应,因此不适合在生产模式下通过重复使用同一通道连续发送数据。
2. 如果您希望在重负载情况下尽快发送请求并获得正确响应,则需要对队列进行进一步的重构,否则性能会非常差。

2

你需要添加一个ChannelHandler。在你的情况下,最简单的方法是扩展SimpleChannelUpstreamHandler并重写channelConnected(…)messageReceived(…)方法。在channelConnected方法中,你需要启动Channel.write(…),而在messageReceived方法中,你会接收到响应。如果响应的顺序与写入的顺序不同,则需要编写自己的处理代码。

另一种解决方案是在调用写操作之前向管道添加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
         ...
      }
});

2
感谢您的回复;很难相信ChannelFuture不像...一个Future一样运作。我在Google上搜索了一个小时,最终在浏览标记为“netty”的内容时找到了您在这里发布的帖子。我注意到您正在处理有关此问题的4.0 alpha问题 - 有任何进展吗?就目前而言,我选择实现了一个Response<T>接口,我的ChannelHandler子类实现了该接口。我将其和ChannelFuture传递给实现Future<T>并充当包装器的类的构造函数。我真想自杀。 - Brian Roach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接