0

非同期接続でクライアント アプリを実装しようとしています。SocketChannelサーバーへの接続に失敗したオブジェクトを再利用できるかどうかを知りたいです。

    SocketChannel channel = SocketChannel.open();
    channel.configureBlocking(false);
    InetSocketAddress addr = new InetSocketAddress(host, port);
    SelectionKey key = channel.register(select, SelectionKey.OP_READ, connection);
    channel.connect(addr);

これが選択ループの後、接続が失敗したため、ソケットが最終的に選択されます。そのチャネルで別の接続試行をキューに入れたいのですが、何もしていないようです。メソッドはchannel.isConnectionPending()常に true を返します (finishConnect を試みても)

これを取り除きSocketChannel、新しいものを作成する唯一の解決策はありますか?

4

3 に答える 3

1

Sun は GPL の下で Java 6.0 ソースをリリースしました。 「ルークのソースを読んで」

コードを読んだところ、connect を 2 回呼び出すことはできません。

于 2009-11-11T23:36:46.260 に答える
0

試してみてください。

100% 確信があるわけではありませんが、finishConnect が呼び出されて返されるか、それから例外がスローされれば問題ないと思います。

接続の周りに try/catch ブロックを配置すると、例外がキャッチされたときに、channel.connect メソッドを再度安全に呼び出すことができます。

それが機能しない場合、答えはおそらくノーです。

于 2009-11-11T23:54:32.460 に答える
0

うーん...私はNIOの専門家ではありませんが、何か怪しいようです. OP_ACCEPT に登録しています。これは、リスニング チャネルが着信接続を受信したときに発生しますが、チャネルを発信接続に使用しています。

選択ループを含め、より多くのコードを投稿する必要があります。

于 2009-11-11T22:09:12.987 に答える