2017-08-04 7 views
-1

JDK stdlib HttpUrlConnectionのソケットレベルオプション(SO_KEEPALIVEなど)を設定する方法はありますか?私は時折 "ハングする"接続(ネットワークパケットの損失が頻繁に発生するために発生するように見える)への被害者にならないHTTPリクエストを取得する方法を見つけようとしています。より堅牢なHTTPクライアント私はsetReadTimeoutメソッドがあることを知っていますが、私は読んだタイムアウトがそうであるように、ちょうどそれを中止するのではなく、生涯に戻ってTCPストリームを微調整する何かを見つけようとしています。または、少なくとも接続に失敗したことを報告してください。しかし、それはまた、接続が「まだアクティブ」であると仮定して、「いつでも、いつでも」読み返すことができます。HttpUrlConnection SO_KEEPALIVEの設定方法

いくつかの調査では、SO_KEEPALIVEのデフォルトは、C層とJavaレベルソケットの両方で「オフ」になっているようです。

+1

あなたはHttpUrlConnectionの使用に結婚していますか? ApacheのHttpClientには、おそらくあなたが探しているものがあります。 [HttpClient](https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/) – drelliot

+0

@drelliot私はあなたが正しいと思っています。答えを自由にしてください。それを受け入れてください:) – rogerdpack

答えて

1

「標準1よりも、別のHTTPクライアントライブラリを使用する」です。

  1. SO_KEEPALIVEは不十分選ばれた名前にもかかわらず、「戻って生活にTCPストリームを微調整」しません。既定の間隔が2時間経過すると、デッド接続が検出されます。それはあなたが探しているものではありません。

  2. 読み取りタイムアウトが接続を中断しません。 SocketTimeoutExceptionがスローされます。接続はまだ生き残っており、その後の読み込みは成功する可能性があります。

  3. ドロップされたパケットが検出され、TCPで再送信されます。

読み取りタイムアウトを使用してください。

+0

私はSO_KEEPALIVEが定期的になると思っていました。そして、どういうわけか他の側に警告します。「私はあなたの最後のパケットを受け取っていませんでした。他の側がすでに接続を切断していることはあまりありません。それは少なくとも送信側が "やあ、このパイプは壊れている!"と通知するリセットで応答すると言われています。だからあなたのように(大)読み取りタイムアウトを設定すると言ったように私のシナリオでは "SO_KEEPALIVEを使用して良い"となります。しかし、もし私が非常に長い読書を成功させたい(または中間のルータ上の活性タイムアウトを避けたい)なら、私はまだSO_KEEPALIVEがほしいかもしれませんね? :) – rogerdpack

+0

@rogerdpackいいえ、SO_KEEPALIVEはあなたの考えをしません。 – EJP

+0

はい、私の最初の希望は "病院"だったようですが、私のコメントを間違って読んだり誤解したりしましたか?私はそれが私が望んだことをしていないことを今見ていると言っていましたが、特定の状況ではまだ何らかの実用性を持っているかもしれません。乾杯! – rogerdpack

-2

はどうやら答えは、これは一つではなく3誤謬に設立され

関連する問題