【问题标题】:Difference between calling close() directly and using ChannelFutureListener.CLOSE直接调用 close() 和使用 ChannelFutureListener.CLOSE 的区别
【发布时间】:2013-07-17 13:04:18
【问题描述】:

我使用的是 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】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是正确的。直接调用 channel.close() 会立即关闭通道,而添加侦听器会在特定写入完成时关闭通道。前者失败是因为在您的写入完成之前通道正在关闭,这就是提供侦听器方法的原因。
      • 谢谢!它们肯定彼此不同。
      猜你喜欢
      • 1970-01-01
      • 2015-11-03
      • 2014-03-05
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2013-11-03
      • 2018-05-26
      相关资源
      最近更新 更多