1

以下のような単純なJava nioプログラムを作成しました

 public static void main(String[] args) throws IOException, InterruptedException {


    InetSocketAddress address = new InetSocketAddress("127.0.0.1",1001);
    Selector incomingMessageSelector = Selector.open();
    SocketChannel socketChannel = SocketChannel.open();
    socketChannel.configureBlocking(false);   

// ここまで、コードはポート 52209 と 52210 への上位 2 つの接続を作成します

    socketChannel.connect(address);
    socketChannel.register(incomingMessageSelector, SelectionKey.OP_CONNECT);
    socketChannel.register(incomingMessageSelector, SelectionKey.OP_WRITE);
    socketChannel.register(incomingMessageSelector, SelectionKey.OP_READ);

// 次に、ポート 1001 への 2 つの接続を作成します

    Thread.sleep(900000L);
}

なぜ 4 つの接続が作成されるのかを理解したいのですが、標準の TCP ブロッキング ライブラリでは 2 つの接続が作成される傾向があります。

JDK 1.7 と Windows 7 を使用しています。

画像では、強調表示された 4 つの接続のみが重要であり、クライアントによって作成されます。

赤でマークされた 1 つの接続 1 エントリは、サーバー ポートです。

PFA は、これら 4 つの接続を示すイメージです。

ええと、私は実際にその理由について最も戸惑いました

Selector incomingMessageSelector = Selector.open();

動的ポートで接続を作成します

ここに画像の説明を入力

4

2 に答える 2

1

1001 と 52211 の間の接続は、両方のポートがローカルであるため、各方向に 1 回ずつ、2 回表示されています。

セレクターは、セレクターごとのソケットの最大数を超えないようにサブセレクターを処理する必要がある場合に、別のリッスン ソケットを開くことができます。

OP_CONNECT pgphasr を終了するまで、OP_READ または OP_WRITE を登録しないでください。OP_CONNECT の登録も解除する必要があります。この 3 つを同時に登録するのは間違いなく間違っています。

于 2013-07-30T12:14:01.720 に答える