1

我有一个 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);
        }
    }
4

1 回答 1

4

我认为您对处理 ChannelFuture 的方式有疑问。

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

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

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

于 2013-04-08T18:51:24.730 回答