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