2013-07-18 16 views
1

我使用的是netty 3.6.6。直接調用close()和使用ChannelFutureListener的差別.CLOSE

有人可以解釋下面兩個代碼之間的區別嗎?

  1. channel.close();

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

當我用1號,我發現網狀發送TCP FIN 發送之前我寫的所有數據包。 因此,客戶端不能發送所有的數據包服務器。 但我找不到2號的問題。

我不明白爲什麼沒有1出現問題。有什麼區別?

在此先感謝。

回答

3

我是netty的新手,這裏是我的選擇: 1.無論您是否有取消發送數據包,都將直接關閉通道。 2.將添加一個監聽器到channelfuture來檢測是否所有的數據包都發出,然後關閉通道

+0

這是正確的。直接調用channel.close()會立即關閉通道,而在特定寫入完成時添加監聽器會關閉通道。前者失敗,因爲在寫入完成之前通道已關閉,這是提供偵聽器方法的原因。 –

+0

謝謝!他們彼此絕對不同。 – oshu

0

從我的經驗:你應該使用Listener版本。

如果您直接關閉通道並且內部隊列中仍有數據,將會發生異常。

使用這種設計的原因是:效率。 IO工作由Netty IO Thread完成,以避免同步或爭用。如果當前線程不是IO工作線程,寫入任務將放入隊列。

你可以檢查NioClientSocketPipelineSink.evenSunk,AbstractNioWorker和NioWorker.scheduleWriteIfNecessary

Netty的是不斷提高的線程模型:https://github.com/netty/netty/wiki/Thread-model

+0

謝謝!我會嘗試研究線程模型。 :) – oshu