8

ここで本当に明白な何かが欠けているような気がします。

私のシステムの全体的な構造は、物事をシンプルに保つために、セレクターなしでブロッキング DatagramChannel を使用したいと考えています。ソケットにタイムアウトを設定してタイムアウト処理を実現しようとしていますが、これは効果がないようです。

この疑似コードは、私が達成しようとしていることのヒントを与えてくれます。

DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(何らかのアドレス);
channel.socket().setSoTimeout(3000);
channel.send(outBuffer, peerAddress);

channel.receive(inBuffer);

反対側には、5 つの迅速な応答を返す UDP サーバーがあり、テスト目的で、6 番目の応答を配信する前に約 5 秒遅れます。

遅延は SocketTimeoutException をトリガーしません。何故ですか?channel.receive を呼び出すときに、ソケットに設定されたタイムアウトが考慮されていないようです。

よろしく、フレドリック

4

2 に答える 2

7

どうやらタイムアウトできないという問題は、DatagramChannel のバグではありませんが、次のようになります。

バグではありません。SocketChannel (および DatagramChannel) の読み取りメソッドは、タイムアウトをサポートしていません。タイムアウト機能が必要な場合は、関連する Socket (または DatagramSocket) オブジェクトの読み取りメソッドを使用します。

リンク。

于 2013-10-14T21:08:00.820 に答える