我正在使用netty 3.6.6。
有人可以解释以下两个代码之间的区别吗?
channel.close();
channel.write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
当我使用No 1时,我发现netty在发送我写的所有数据包之前发送了TCP FIN 。 因此,客户端无法将所有数据包发送到服务器。 但我找不到No 2的问题。
我不明白为什么No 1会出问题。有什么区别?
提前致谢。
答案 0 :(得分:3)
我是netty的新手,这是我的选择: 1.无论你是否有解包,都会直接关闭通道。 2.将向channelfuture添加一个监听器,以检测是否所有数据包都被发送,然后关闭该通道
答案 1 :(得分:0)
根据我的经验:你应该使用Listener版本。
如果直接关闭通道并且内部队列中仍有数据,则会出现异常。
使用这种设计的原因是:效率。 IO工作由Netty IO Thread完成,以避免同步或争用。如果当前线程不是IO工作线程,则写入任务将进入队列。
您可以查看NioClientSocketPipelineSink.evenSunk,AbstractNioWorker和NioWorker.scheduleWriteIfNecessary
Netty不断改进其线程模型:https://github.com/netty/netty/wiki/Thread-model