netty:channel.write()不成功,原因为null

时间:2013-04-08 16:00:25

标签: netty channel

我有一个netty客户端基本上做了以下几点:

通过TCP连接到服务器后,程序将调用以下代码段。第一次进展顺利,但第二次有以下症状 - 它永远循环。频道已连接。 channelFuture.isDone()== false。 channelFuture.isSuccess()== false和channelFuture.getCause()== null。我可以看到没有例外或任何有助于我了解问题的信息。我有什么想法可以获得更多信息来调试这个问题吗?

    ChannelFuture channelFuture = null;

    while (channelFuture == null || !channelFuture.isSuccess()) {
        try {
            channelFuture = channel.write(content);
            channelFuture.await(1000);

        } catch (InterruptedException ex) {
            Logger.getGlobal().log(Level.SEVERE, "Interrupted ", ex);
        }
    }

1 个答案:

答案 0 :(得分:4)

我认为您对如何处理ChannelFuture有疑问。

在您发布的代码中,如果循环的任何迭代导致写入失败,那么当循环的后续迭代开始(1000ms之后),因为channelFuture被重新分配,这个失败和原因将会丢失。此外,如果写入完成所需的时间超过1000毫秒,那么您将在下一次迭代中添加排队写入并在每次迭代后进一步下降,因为channelFuture会持续替换,并且在您检查之前写入永远不会在1000毫秒内完成channelFuture.isSuccess()。

使用您发布的代码,您可以执行的操作是读取channelFuture.await(1000)的返回值,以查看写入是成功还是失败,而不是盲目地继续写入并丢弃channelFuture。

但是,理想情况下,您根本不应使用ChannelFuture.await(),而是使用ChannelFuture.addListener()添加将在写入完成时执行的侦听器。这是使用Netty和使用异步代码的正确方法。