netty:channel.write()未成功,原因为空

netty:channel.write()未成功,原因为空,netty,channel,Netty,Channel,我有一个内急的客户,主要做以下工作: 通过TCP连接到服务器后,程序调用下面的代码段。第一次进展顺利,但第二次出现以下症状-它永远循环。通道已连接。channelFuture.isDone()==false。channelFuture.isSuccess()为false,channelFuture.getCause()为null。没有例外,我可以看到或任何信息,帮助我了解问题是什么。有什么想法可以让我得到更多的信息来调试这个问题吗 ChannelFuture channelFuture

我有一个内急的客户,主要做以下工作:

通过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);
        }
    }

我认为你对如何处理未来有问题

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

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


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

我认为您在处理未来的问题上有问题

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

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

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