java.net.SocketException:ソフトウェアが接続を中止しました:recvが失敗しました[複製]

StackOverflow https://stackoverflow.com/questions/135919

  •  02-07-2019
  •  | 
  •  

質問

    

この質問にはすでに回答があります:

         

次のエラーの正確な意味に対する適切な答えを見つけることができませんでした:

java.net.SocketException:ソフトウェアにより接続が中断されました:recvが失敗しました

注:

  • このエラーはまれであり、予測不能です。ただし、このエラーが発生するということは、URIに対する今後のすべてのリクエストも失敗することを意味します。
  • 動作する唯一の解決策は(また、たまにのみ)Tomcatおよび/または実際のマシン(この場合はWindows)を再起動することです。
  • URIは間違いなく使用可能です(ブラウザーにフェッチを行うように依頼することで確認されています)。

関連コード:

BufferedReader reader;
try { 
 URL url = new URL(URI);
 reader = new BufferedReader(new InputStreamReader(url.openStream())));
} catch( MalformedURLException e ) { 
 throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream

String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) ) { 
 result.append(buffer); 
}//end while: Got the contents.
reader.close();
役に立ちましたか?

解決

これは通常、TCPタイムアウトなどのネットワークエラーがあったことを意味します。まず、接続にスニファー(wireshark)を配置して、問題が発生するかどうかを確認します。 TCPエラーがある場合は、表示できるはずです。また、該当する場合、ルーターのログを確認できます。ワイヤレスがどこかに関係している場合、それはこの種のエラーの別の原因です。

他のヒント

これは、クライアント認証を要求するように構成されたサーバーがTLSクライアントを認証できない場合にも発生します。

このエラーは、接続が突然閉じられた場合(送信バッファーにデータが残っている間にTCP接続がリセットされた場合)に発生します。この状態は、より一般的な「ピアによる接続リセット」に非常に似ています。インターネット経由で接続すると散発的に発生する可能性がありますが、タイミングが適切な場合は体系的に発生することもあります(たとえば、localhostでのキープアライブ接続の場合)。

HTTPクライアントは、接続を再度開き、要求を再試行するだけです。接続がこの状態にあるとき、接続を閉じる以外にその接続から抜け出す方法がないことを理解することが重要です。送受信しようとすると、同じエラーが発生します。

URL.open()は使用せず、Apache-Commons 再試行メカニズム、接続プーリング、キープアライブ、その他の多くの機能を備えたHttpClient

使用例:

HttpClient httpClient = HttpClients.custom()
            .setConnectionTimeToLive(20, TimeUnit.SECONDS)
            .setMaxConnTotal(400).setMaxConnPerRoute(400)
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setSocketTimeout(30000).setConnectTimeout(5000).build())
            .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
            .build();
// the httpClient should be re-used because it is pooled and thread-safe.

HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...

httpデータにアクセスしていますか?標準ライブラリの代わりにHttpClientライブラリを使用できますか?ライブラリにはより多くのオプションがあり、より良いエラーメッセージを提供します。

http://hc.apache.org/httpclient-3.x/

このような状況が発生するのは、接続状態が悪いとき、または別のスレッドコンテキストから使用しているソケットを誰かが閉じているときだけです。

jdbc接続文字列に「autoReconnect = true」を追加してみてください

これは、接続がタイムアウトしたとき、またはリモートホストが接続を終了したとき(閉じられたアプリケーション、コンピューターのシャットダウンなど)に発生します。これを回避するには、ソケットを自分で管理し、アプリケーションの通信プロトコルを介して切断を処理し、 shutdownInput および shutdownOutput を呼び出してセッションをクリアします。

httpポートで別のサービスまたはプログラムが実行されているかどうかを確認します。このポートを使用しようとしたときに、別のプログラムによって使用されたときに起こりました。

私もこの問題を抱えていました。私の解決策は:

sc.setSoLinger(true, 10);

Webサイトからのコピー-> setSoLinger()メソッドを使用することにより、リセットが送信される前に明示的に遅延を設定し、データの読み取りまたは送信にさらに時間をかけることができます。

多分、それはすべての人への答えではなく、一部の人々への答えでしょう。

Netbeansを使用してTomcatを管理している場合は、ツール-サーバーでHTTPモニターを無効にしてみてください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top