2

私はnetty 3.6.6を使用しています。

誰かが次の 2 つのコードの違いについて説明できますか?

  1. channel.close();

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

No 1 を使用したとき、netty は私が書いたすべてのパケットを送信する前にTCP FIN を送信することがわかりました。その結果、クライアントはサーバーが送信したすべてのパケットを送信できませんでした。しかしNo.2については問題が見つかりませんでした。

No 1がなぜ問題を起こすのか理解できません。違いは何ですか?

前もって感謝します。

4

2 に答える 2

0

私の経験から:リスナーバージョンを使用する必要があります。

チャネルを直接閉じても、内部キューにまだデータがある場合、例外が発生します。

この種の設計を使用する理由は、効率です。IO 作業は、同期や競合を避けるために Netty IO スレッドによって実行されます。現在のスレッドが IO ワーカー スレッドでない場合、書き込みタスクはキューに入れられます。

NioClientSocketPipelineSink.evenSunk、AbstractNioWorker、および NioWorker.scheduleWriteIfNecessary を確認できます。

Netty はスレッド モデルを改善し続けています: https://github.com/netty/netty/wiki/Thread-model

于 2013-07-19T02:39:35.143 に答える