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) 的区别