6

Netty バージョン 2.6.0.Final を使用しています。

Netty のドキュメントを正しく理解していれば、Channel で disconnect() を呼び出すと、connect() を呼び出して後で再度接続できるはずです。ただし、disconnect() を呼び出すと、SimpleChannelHandler サブクラスの channelDisconnected() と channelClosed() の両方が呼び出されます。

これをデバッグモードで開いたところ、基本的にイベントの順序は次のとおりです。

  1. チャンネルで disconnect() を呼び出します
  2. Channels.disconnect() が呼び出されます:

    public static ChannelFuture disconnect(Channel channel) {
      ChannelFuture future = future(channel);
      channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent(
            channel, future, ChannelState.CONNECTED, null));
      return future;
    }
    
  3. 最終的に、NioSocketPipelineSink.eventSunk() が呼び出され、関連する部分は次のとおりです。

        case CONNECTED:
            if (value != null) {
                connect(channel, future, (SocketAddress) value);
            } else {
                channel.worker.close(channel, future);
            }
            break;
    

したがって、値が null で状態が CONNECTED であるため、チャネルは閉じられます (ただし、hereによると、null を使用した CONNECTED は切断要求を示す必要があり、必ずしも閉じる必要はありません。

ここで何か不足していますか?チャネルが閉じられるだけの場合、disconnect() のポイントは何ですか?

これは大きな問題ではありません。必要に応じて自分の状況に合わせて新しいチャネルを作成するだけでよいのですが、最初の検査では、これがどのように機能するかを誤解していない限り、Netty のバグのように思えます。ばかげたことをしている。

4

1 に答える 1

8

Netty の目的の 1 つは、基礎となる実装、OIO、NIO、または AIO に関係なく、コネクション型ソケット (TCP) とコネクションレス ソケット (UDP) の場合とほぼ同じように機能する、統一されたチャネル抽象化を提示することです。かなりの数の違いがあるため、統一されたインターフェースは、特定の実装のいくつかの部分では少し奇妙に見えます。

TCP ソケットを切断する行為は、それを閉じることを意味します (少なくとも Java API の観点からは)。ただし、UDP ソケットの切断は、それを閉じることを意味するわけではなく、ローカル IP アドレス/ポートとリモート IP アドレス/ポートの間の関連付けを削除するだけです。

いいえ、ばかげたことはしていませんが、UDP ソケットを別のリモート ターゲットにその存続期間中に「接続」する必要がない限り、代わりに OPEN/CLOSE イベントに対処することをお勧めします。

編集:前の段落で重要な「not」を見逃しました。

于 2013-01-02T22:56:08.983 に答える