2011-12-13 86 views
5

我试图拼凑Netty客户端。我需要发送一个请求到服务器(我不控制),我期待着回应。Netty客户端,如何从发送到服务器的请求获得回应

我不确定如何获得回应。

所以,如果我有:

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

我如何获得响应数据进行响应的ChannelFuture的?我是否需要将ChannelHandler添加到引导程序管道中?如果是这样,我如何将响应与请求相关联?

感谢,

+0

你最终找到你的问题的答案,因为我有这个非常相同的问题... – 2012-01-28 21:18:33

回答

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

感谢您对此作出回应;很难相信ChannelFuture不会像......未来一样。我不敢相信Google搜索了一个小时,终于在这里找到了你的帖子,通过标记'netty'的东西。我注意到你参与4.0 alpha的一个问题关于这个 - 任何运动?就像我一样,我实现了一个`Response ``我的`ChannelHandler`子类实现的接口。我把那个和`ChannelFuture`传递给一个实现`Future `的类的构造函数,并作为包装器。我想吊死自己。 – 2012-02-16 06:55:41

2

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

但这仍然是一个“Hello World”展示的项目,所以仍然有2个问题,我们需要考虑:

  1. 此示例中的想法是,一旦发送一批,并得到一个响应一旦。因此,重复使用同一频道不适合连续发送生产模式。

  2. 如果您想要发送请求并在负载较重的情况下尽快找回正确的响应,则需要对队列进行一些重构,否则性能非常差。

相关问题