ConnectionTimeoutとSocketTimeout


135

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

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

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

タイムアウト例外は生成されず、正常に動作しますが、以下を実行すると、

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

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

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

回答:


227

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

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

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

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


1
サーバーがダウンしていないがビジーである場合、接続タイムアウトが発生する可能性はありますか?それともソケットタイムアウトでしょうか?
Robert

9
これは、サーバーが過負荷になる前にTCP接続が確立されている場合はソケット例外が発生します。そうでない場合は、TCP接続が確立できなかったことを示す接続例外が発生します。
Robert

2
特に古いモバイルネットワークのレイテンシが高いことを考慮して、接続タイムアウトを数秒に設定する必要があります(例:10秒以上10000ミリ秒)。HTTPはリクエスト後に接続を再利用できるため、いくつかの接続を使用しない場合にのみ設定するソケットタイムアウト。
Robert

1
これは、ソケットタイムアウト(1分など)を設定した場合、接続が1分間非アクティブになると強制終了されることを意味しますか?
ロバート

2
@Robertサーバーがビジー状態の場合、必ずしも接続例外が発生するわけではありません。サーバープラットフォーム上では、プラットフォームに依存します。ソケット読み取りタイムアウトは、接続を強制終了しません。SocketTimeoutExceptionが発生するだけです。接続がまだ使用可能かどうかは、アプリケーションが決定する必要があります。ソケットでこれ以上I / Oを試すことができないというAPIについては確かに何もありません。複数の接続を使用する場合にタイムアウトを使用しないことについてのあなたの声明は意味を成し始めません。ここにはあまりにも多くの誤った情報があります。
ローン侯爵2014

83

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

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


3
はい。1.では、SocketTimeoutは、接続がすでに確立されている場合にのみ有効になると言えますか?2. 3つのパケットが受信された後、たとえば5分間データフローがない場合はどうなりますか?3番目のパケットを受信した後、SocketTimeout例外はありますか?
Saurabh Patil 2017

2
@SaurabhPatil 1.はい。確認については、ウィキペディアのHTTPプロトコルの技術概要を参照してください。2.メッセージの終わりが送信されると、それ以上のデータは必要ないため、ソケットタイムアウトは発生しません。トピックについては、この回答を参照してください。
entpnerd 2017

7
彼らが「ソケットタイムアウト」を「アイドルタイムアウト」と名付けたらよかったのに。
マニッシュMaheshwari
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.