Tcp 客户端通道未处于可写状态(NIO)Netty

Tcp 客户端通道未处于可写状态(NIO)Netty,tcp,client,netty,nio,channel,Tcp,Client,Netty,Nio,Channel,客户端通道在netty中未处于可写状态。有专家能指导我找出原因吗 为什么通道始终不处于可写状态 while (!ctx.getChannel().isWritable()) { Thread.sleep(100); } 由于它不处于可写状态,我们的线程处于睡眠模式。我们使用线程转储分析了线程的状态,在下面的循环中添加了一个计数器,它等待一分钟,然后退出循环。但我真的想找出不可写状态的原因 通道关闭后,通道是否仍保留在ctx中(如果客户端未发送EOF) 如果会发生这种情况(意味着

客户端通道在netty中未处于可写状态。有专家能指导我找出原因吗

为什么通道始终不处于可写状态

while (!ctx.getChannel().isWritable()) {
    Thread.sleep(100);
    }
由于它不处于可写状态,我们的线程处于睡眠模式。我们使用线程转储分析了线程的状态,在下面的循环中添加了一个计数器,它等待一分钟,然后退出循环。但我真的想找出不可写状态的原因

通道关闭后,通道是否仍保留在ctx中(如果客户端未发送EOF)

如果会发生这种情况(意味着永远不会处于可写状态)

请帮忙


非常感谢

您应该使用选择器,或者Netty提供的任何选择器,来告诉您频道何时可写。你当然不应该浪费时间睡在一个圈里。进行此操作时,频道状态无法更改。它仅通过
select()。

进行更改。表面上,这是因为ChannelBuffer已满,即不再有可写字节


这可能是由于写入速度过快,或者通道无法发送任何字节造成的。如果写入速度不太快,可能是因为通道从未成功发送写入的字节。

while(ctx.getChannel().isWritable()){//write something}如果我们这样放置,它将等待选择器将通道切换到写入m模式。如果通道处于其他状态,无法以可写方式返回,线程可能会进入无限循环。@JohnChristy正是,所以不要这样做。当你睡觉时,频道状态不会神奇地改变。您需要调用
select()
来完成此操作。我们正在快速写入其他客户端的通道,无法通知其他客户端的断开连接。如果我们试图检查一个已经关闭的可写通道,但服务器没有检测到通道关闭事件,会发生这种情况吗?@JohnChristy我没有使用netty,但我希望您有办法测试通道是否关闭。是的,您是对的。但是如果我们没有得到通道关闭事件(因为网络故障),我们无法检查它是否关闭。如果我们在客户机和服务器之间有一个合适的网络,我们就可以检查这个特定的通道是否关闭。@JohnChristy在网络故障的情况下,检测另一端死机的正常过程是超时。如果此频道在一定时间内不可写,则可以将其视为已关闭。如果你能控制另一端,你也可以做你自己的心脏跳动刺探。如果在一定时间内没有从另一端接收到心跳,则认为另一端已死亡,通道不可用。