3つの質問:
connectionとreadソケットのタイムアウトの違いは何ですか?
接続「無限」に設定されたタイムアウトとはどういう意味ですか?どのような状況で無限ループにとどまることができますか?そして、無限ループが死ぬことをトリガーするものは何ですか?
読み取り「無限」に設定されたタイムアウトとはどういう意味ですか?どのような状況で無限ループにとどまることができますか?そして、無限ループが死ぬことをトリガーするものは何ですか?
1)ソケットの接続と読み取りタイムアウトの違いは何ですか?
接続タイムアウトは、初期接続を確立する際のタイムアウトです。つまり、TCP接続ハンドシェイクを完了します。読み取りタイムアウトは、データの読み取りを待機する際のタイムアウトです1。具体的には、サーバーが最後のバイトの<timeout>秒後にバイトを送信できない場合、読み取りタイムアウトエラーが発生します。
2)接続タイムアウトが「無限大」に設定されているとはどういう意味ですか?どのような状況で無限ループにとどまることができますか?そして、無限ループが死ぬことをトリガーするものは何ですか?
接続試行が永久にブロックされる可能性があることを意味します。無限ループはありませんが、ソケットを閉じる別のスレッドによって接続のブロックを解除できます。 (Thread.interrupt()
呼び出しもトリックを行う可能性があります...わかりません。)
3)読み取りタイムアウトが「無限大」に設定されているとはどういう意味ですか?どのような状況で無限ループにとどまることができますか?無限ループが終了するきっかけは何ですか?
これは、ソケットストリームのread
の呼び出しが永久にブロックされる可能性があることを意味します。再び無限ループはありませんが、read
は、Thread.interrupt()
呼び出し、ソケットのクローズ、および(もちろん)データの送信または接続のクローズによってブロックを解除できます。
1-それは...あるコメンターが考えたように...ソケットがオープンまたはアイドル状態になり得る時間のタイムアウトではありません。
これらは、TCP接続確立のためにJVMによって強制され、ソケットからのデータの読み取りを待機するタイムアウト値です。
値が無限に設定されている場合、永遠に待機することはありません。 JVMにタイムアウトがなく、OSがすべてのタイムアウトを処理することを意味します。ただし、OSのタイムアウトは非常に長い場合があります。低速のネットワークで、6分間のタイムアウトが発生しました。
ソケットのタイムアウト値を設定しても、ネイティブコードでタイムアウトが発生すると動作しない場合があります。 Linuxで問題を再現するには、ファイアウォールでブロックされたホストに接続するか、スイッチのケーブルを取り外します。
TCPタイムアウトを処理する唯一の安全な方法は、接続コードを別のスレッドで実行し、時間がかかりすぎるとスレッドを中断することです。