web-dev-qa-db-ja.com

ConnectionTimeoutとSocketTimeout

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

基本的に、これを行うと(ミリ秒単位のタイムアウト)

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

タイムアウト例外は生成されず、正常に動作しますが、次の操作を行うと、

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

ソケット例外が発生します。

だから、私の質問は、なぜ接続例外をシミュレートできないのですか?ソケットと接続タイムアウトの違いを誤解していますか?ライブラリは here (まだ公式にはリリースされていません)です。

116
Robert

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

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

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

着信ストリームのみが1ミリ秒以上停止する場合、タイムアウトになります。

203
Robert

接続タイムアウトは、プログラムが別のプロセスへの接続のセットアップを待機する最大時間です。この時点では、アプリケーションデータを取得または投稿するのではなく、接続自体を確立するだけです。

ソケットタイムアウトは、個々のパケットを待機するときのタイムアウトです。ソケットタイムアウトは、完全な応答を受信するためのタイムアウトであるという一般的な誤解です。したがって、ソケットタイムアウトが1秒で、応答が3つのIPパケットで構成され、各応答パケットが到着するのに0.9秒かかり、合計応答時間が2.7秒の場合、タイムアウトはありません。

68
entpnerd