按照此示例 Netty4 confusion with simple example ,我试图从管道中的特定处理程序获取服务器的响应,如下所示:
ChannelFuture future = CLIENT.start();
CLIENT.sendCmd(MyServerHandler.STATUS_CMD);
future.channel().closeFuture().awaitUninterruptibly();
MyClientHandler handler = future.channel().pipeline().get(MyClientHandler.class);
String response = handler.getResponse();
getResponse()方法只是一个属性字段getter,它从channelRead0()方法获取服务器的响应,如下所示:
public class MyClientHandler extends SimpleChannelInboundHandler<String> {
private String _response;
public String getResponse()
{
return( _response );
}
protected void channelRead0(ChannelHandlerContext ctx, String input)
throws Exception
{
_response = input;
}
// blah...
}
在循环中创建许多客户端时,几乎有一半会抛出NullPointerException,因为出于某种原因, handler 对象为NULL!
我在这里缺少什么?
答案 0 :(得分:0)
经过长时间的调试,我发现必须在 closeFuture()。awaitUninterruptibly()之前调用 pipeline()。get()。我猜这个处理程序已经在我的原始代码中被丢弃了。但为什么? 频道对象尚未关闭!
MyClientHandler handler = future.channel().pipeline().get(MyClientHandler.class);
future.channel().closeFuture().awaitUninterruptibly();
String response = handler.getResponse();
我希望有些“netty4 nerd”可以验证这个......?