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

Netty客户端,如何从发送到服务器的请求中获取响应,netty,Netty,我想把一个脾气暴躁的客户撮合起来。我需要发送一个请求到一个服务器(我无法控制),我希望得到一个响应 我不太确定如何回复 如果我有: ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654)); Channel connector = future.awaitUninterruptibly().getChannel(); ChannelFuture response = connector.wri

我想把一个脾气暴躁的客户撮合起来。我需要发送一个请求到一个服务器(我无法控制),我希望得到一个响应

我不太确定如何回复

如果我有:

ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654));
Channel connector = future.awaitUninterruptibly().getChannel();
ChannelFuture response = connector.write(query);
如何从响应通道中获取响应数据?我是否需要向引导管道添加ChannelHandler?如果是,我如何将响应与请求关联


谢谢,

是的,您需要添加一个
ChannelHandler
。在您的情况下,最简单的方法是扩展
SimpleChannelUpstreamHandler
并覆盖
channelConnected(…)
方法和
messageReceived(…)
方法。在
channelConnected
中,您将启动
频道。写入(…)
并在
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
         ...
      }
});

首先,您可以参考localtime的示例。在“LocalTimeClientHandler”的处理程序中,您可以找到阻止请求/响应的技巧

但这仍然是一个“hello world”展示项目,因此我们仍然需要考虑两个问题:

  • 本示例中的想法是发送一次批处理,然后返回一次响应。因此,生产模式不适合通过重复使用同一通道来连续发送

  • 如果您想在负载较重的情况下尽快发送请求并获得正确的响应,则需要进一步重构队列,否则性能会非常差


  • 你是否最终找到了你问题的答案,因为我有一个非常相同的问题…谢谢你的回答;很难相信未来的渠道不会像。。。a
    未来
    。我难以置信地在谷歌上搜索了一个小时,终于在这里找到了你的帖子,上面有“netty”的标签。我注意到你涉及到一个关于4.0 alpha的问题-有任何移动吗?就这样,我开始实现我的
    ChannelHandler
    子类实现的
    Response
    接口。我将它和
    ChannelFuture
    传递给实现
    Future
    并充当包装器的类的构造函数。我想上吊自杀。