次のエラーの正確な意味に対する適切な答えを見つけることができませんでした。
Java.net.SocketException: Software caused connection abort: recv failed
ノート:
関連コード:
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ライブラリを使用できますか?ライブラリにはより多くのオプションがあり、より良いエラーメッセージを提供します。
このようなことが起こるのは、接続状態が悪いとき、または別のスレッドコンテキストから使用しているソケットを誰かが閉じているときだけです。
Jdbc接続文字列に「autoReconnect = true」を追加してみてください
Httpポートで別のサービスまたはプログラムが実行されているかどうかを確認してください。ポートを使用しようとしたときに、別のプログラムがそれを取得しました。
私もこの問題を抱えていました。私の解決策は:
sc.setSoLinger(true, 10);
Webサイトからのコピー-> setSoLinger()
メソッドを使用すると、リセットが送信される前に明示的に遅延を設定し、データの読み取りまたは送信にさらに時間をかけることができます。
たぶんそれはすべての人に対する答えではなく、一部の人々に対する答えです。
これは、接続がタイムアウトしたとき、またはリモートホストが接続を終了したとき(閉じられたアプリケーション、コンピューターのシャットダウンなど)に発生します。これを回避するには、ソケットを自分で管理し、アプリケーションの通信プロトコルを介して切断を処理し、shutdownInput
およびshutdownOutput
を呼び出してセッションをクリアします。
Netbeansを使用してTomcatを管理している場合は、ツール-サーバーでHTTPモニターを無効にしてみてください