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

Posted

技术标签:

【中文标题】netty:channel.write() 不成功,原因为空【英文标题】:netty: channel.write() does not succeed and cause is null 【发布时间】:2013-03-30 19:29:07 【问题描述】:

我有一个 netty 客户端,它基本上执行以下操作:

通过TCP连接到服务器后,程序调用下面的sn-p。第一次顺利,但第二次有以下症状 - 它永远循环。通道已连接。 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】:

我认为您在处理 ChannelFuture 的方式上存在问题。

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

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

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

【讨论】:

以上是关于netty:channel.write() 不成功,原因为空的主要内容,如果未能解决你的问题,请参考以下文章

确定一个 netty 客户端。 ctx.Write(obj) 和 ctx.channel().Write(obj) 的区别

如何关闭写作频道

使用 Netty 编写的有效方法

从其他应用程序线程写入Netty通道

Channel.write 和 ChannelHandlerContext.write 的区别

springboot启动成功后启动netty服务端