1. ホーム
  2. java

[解決済み] ConnectionTimeoutとSocketTimeoutの比較

2022-04-30 05:13:34

質問

使用しているライブラリに問題があります。ライブラリのせいかもしれないし、私の使い方が間違っているのかもしれません。

基本的にこのようにすると(タイムアウトはミリ秒単位)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

タイムアウト例外も発生せず、問題なく動作していますが、以下のようにした場合。

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Socket Exceptionが発生します。

そこで質問なのですが、なぜConnection Exceptionをシミュレートできないのでしょうか?私は、ソケットと接続タイムアウトの違いを誤解しているのでしょうか?ライブラリは こちら (まだ正式にはリリースされていません)。

解決方法は?

A 接続タイムアウト は、TCP接続を開始するときにのみ発生します。これは通常、リモートマシンから応答がない場合に発生します。これは、サーバーがシャットダウンされたか、間違ったIP/DNS名、間違ったポートを使用したか、サーバーへのネットワーク接続が停止していることを意味します。

A ソケットタイムアウト は、連続した受信データフローを監視するために専用されています。指定されたタイムアウトの間、データフローが中断された場合、接続は停止/切断されたとみなされます。もちろん、これはデータが常時受信されている接続でのみ機能します。

ソケットのタイムアウトを1に設定すると、ミリ秒ごとに新しいデータを受信する必要があります(データブロックを賢く読み、ブロックが十分に大きいと仮定します)!このように、ソケットのタイムアウトを1に設定すると、1ミリ秒ごとに新しいデータを受信する必要があります。

受信ストリームだけが1ミリ秒以上停止した場合、タイムアウトに陥ります。