我正在尝试拼凑一个Netty客户端。我需要向服务器发送请求(我无法控制),我期待回复。
我不确定如何得到回复。
所以,如果我有:
ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654));
Channel connector = future.awaitUninterruptibly().getChannel();
ChannelFuture response = connector.write(query);
如何从响应ChannelFuture中获取响应数据?我是否需要在Bootstrap管道中添加ChannelHandler?如果是这样,我如何将响应与请求相关联?
谢谢,
答案 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"展示项目,所以我们还需要考虑两个问题:
此示例中的想法是发送一次批处理并返回一次响应。所以它不适合通过重复使用同一频道连续发送的制作模式。
如果你想发送请求并尽快回复正确的响应,你需要稍微重构一下队列,否则性能真的很差。