web-dev-qa-db-ja.com

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

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

Java.net.SocketException: Software caused connection abort: recv failed

ノート:

  • このエラーはまれであり、予測できません。ただし、このエラーが発生するということは、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();
73
grammar31

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

24
AdamC

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

21
desbocages

このエラーは、接続が突然閉じられた場合(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 ...
10
rustyx

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

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

4
Ken

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

4
pfranza

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

2
Anantharaman

Httpポートで別のサービスまたはプログラムが実行されているかどうかを確認してください。ポートを使用しようとしたときに、別のプログラムがそれを取得しました。

1
trinity

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

sc.setSoLinger(true, 10);

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

たぶんそれはすべての人に対する答えではなく、一部の人々に対する答えです。

1
Sergio

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

1
Michael J. Gray

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

0
Maroš Košina