2

我正在使用netty 3.6.6。

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

  1. 通道.close();

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

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

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

提前致谢。

4

2 回答 2

4

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

于 2013-07-18T14:56:19.537 回答
0

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

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

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

你可以检查 NioClientSocketPipelineSink.evenSunk、AbstractNioWorker 和 NioWorker.scheduleWriteIfNecessary

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

于 2013-07-19T02:39:35.143 回答