直接调用close()和使用ChannelFutureListener.close之间的区别



我使用的是netty 3.6.6。

有人能解释一下以下两个代码之间的区别吗?

  1. channel.close();

  2. channel.write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);

当我使用No 1时,我发现netty在发送我编写的所有数据包之前发送了TCP FIN。因此,客户端无法发送服务器发送的所有数据包。但我找不到2号的问题。

我不明白为什么1号会出问题。有什么不同?

提前谢谢。

我是netty的新手,这是我的选择:1.无论您是否有未发送的数据包,都将直接关闭通道。2.将向channelfuture添加一个侦听器,以检测是否所有数据包都已发送,然后关闭通道

根据我的经验:您应该使用Listener版本。

如果直接关闭通道,并且内部队列中仍有数据,则会出现异常。

使用这种设计的原因是:效率。IO工作由Netty IO线程完成,以避免同步或争用。如果当前线程不是IO工作线程,则写入任务将被放入队列。

您可以检查NioClientSocketPipelineSink.evenSunk、AbstractNioWorker和NioWorker.scheduleWriteIfNenecessary

Netty正在不断改进其线程模型:https://github.com/netty/netty/wiki/Thread-model

最新更新