2011-09-09 36 views
86

私が使用しているライブラリに問題があります。ライブラリであるか間違っているかもしれません!ConnectionTimeoutとSocketTimeoutの比較

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

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

ませタイムアウト例外が発生していない作品[OK]を、私はこれを行うときは、しかし、:

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

を私はソケット例外を取得します。

なぜ私は接続例外をシミュレートできないのですか?私はソケットと接続タイムアウトの違いを誤解していますか?図書館はhereです(公式にはまだ正式に承認されていません)。

答えて

159

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

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

ソケットタイムアウトを1に設定すると、1ミリ秒ごとの新しいデータが受信されることが必要になります(データブロックを十分に読んで、ブロックが十分大きければ)!

受信ストリームが1ミリ秒以上ストールした場合は、タイムアウトになります。

+1

サーバーがダウンしていなくてもビジー状態になる場合は、接続タイムアウトが発生しますか。それともソケットタイムアウトですか? – Robert

+7

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

+0

また、モバイルデバイスのソケットタイムアウトと接続タイムアウトの典型的な値は何ですか? 1つは通常他のものより大きいですか? – Robert

42

接続タイムアウトは、プログラムが別のプロセスへの接続をセットアップするのを待つ最大時間です。現時点では、接続を確立するだけで、アプリケーションデータを取得したり投稿したりすることはありません。

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

+0

1.SocketTimeoutは、Connectionがすでに確立されている場合にのみ表示されます。 2. 3パケットを受信して​​から5分後のようなデータフローがない場合はどうなりますか? 3番目のパケットを受信した後でSocketTimeout例外が発生しますか? –

+0

@SaurabhPatil 1.はい。確認のために[WikipediaのHTTPプロトコルの技術概要](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Technical_overview)を参照してください。 2.メッセージの終わりが送信されると、それ以上のデータは必要ないので、ソケットタイムアウトは発生しません。このトピックに関する[この回答](https://stackoverflow.com/a/4824738/4851565)を参照してください。 – entpnerd