Netty客户端,如何从发送到服务器的请求获得回应
我试图拼凑Netty客户端。我需要发送一个请求到服务器(我不控制),我期待着回应。Netty客户端,如何从发送到服务器的请求获得回应
我不确定如何获得回应。
所以,如果我有:
ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654));
Channel connector = future.awaitUninterruptibly().getChannel();
ChannelFuture response = connector.write(query);
我如何获得响应数据进行响应的ChannelFuture的?我是否需要将ChannelHandler添加到引导程序管道中?如果是这样,我如何将响应与请求相关联?
感谢,
是的,你需要添加一个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
...
}
});
感谢您对此作出回应;很难相信ChannelFuture不会像......未来一样。我不敢相信Google搜索了一个小时,终于在这里找到了你的帖子,通过标记'netty'的东西。我注意到你参与4.0 alpha的一个问题关于这个 - 任何运动?就像我一样,我实现了一个`Response
首先,您可能会参考localtime的示例。在“LocalTimeClientHandler”的处理程序中,您可以找到阻止请求/响应的技巧。
但这仍然是一个“Hello World”展示的项目,所以仍然有2个问题,我们需要考虑:
此示例中的想法是,一旦发送一批,并得到一个响应一旦。因此,重复使用同一频道不适合连续发送生产模式。
如果您想要发送请求并在负载较重的情况下尽快找回正确的响应,则需要对队列进行一些重构,否则性能非常差。
你最终找到你的问题的答案,因为我有这个非常相同的问题... – 2012-01-28 21:18:33