1

ソケットを介して別の HOST と通信するクラスがあり、次のようになります。

SocketChannel sc = SocketChannel.open(new InetSocketAddress(HOST, PORT));
sc.configureBlocking(true);

...
sc.write(...)
sc.read(...)

このクラスは、HOST がダウンしていて SocketChannel.open が永久にブロックされる場合を除いて、うまく機能します。次のようにして、このタイムアウトを作成しようとしました。

SocketChannel  = SocketChannel.open();
sc.configureBlocking(false);
boolean result = socketChannel.connect(new InetSocketAddress(HOST, PORT));
if (!result) {
    long startTime = System.currentTimeMillis();
    while (!socketChannel.finishConnect()) {
        if (System.currentTimeMillis() - startTime< 1000) {
            // keep trying
            Thread.sleep(100);
        } else {
            // FAILED!
            enabled = false;
            return;
        }
    }
}
// SUCCESS!
socketChannel.configureBlocking(true);
enabled = true

なんらかの理由で、finishConnect() がまったくブロックされないと予想していたときに、永久にブロックされています。何か案は?

4

1 に答える 1

5

あなたはこれを間違っています。

  1. 未接続を作成しSocketChannel、ブロッキング モードで時限接続を行います。

また

  1. Selectorノンブロッキング モードでa を使用します。のチャンネルを登録してOP_CONNECT選択します。接続可能になったら呼び出しfinishConnect(),、true が返ってきたら登録解除OP_CONNECTして I/O を進めます。false が返された場合は、選択を続けます。例外がスローされた場合、接続が断念され、失敗しています。選択タイムアウトを使用します。スピンループではありません。
于 2013-05-04T00:21:29.603 に答える