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

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

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

`java.net.SocketException:ソフトウェアが原因で接続が中断されました: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();

  69  13


ベストアンサー

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

22


TLSクライアントがクライアント認証を要求するように設定されたサーバーによって認証されることができないならば、これはまた起こります。

20


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

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

`URL.open()`を使わず、Apache-Commons https://hc.apache.org/httpcomponents-client-ga/ [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


私がこのようなことが起こるのを見た唯一の時は私が悪い接続を持っているときか、誰かが私が使用しているソケットを別のスレッドコンテキストから閉じているときです。

4


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

3


JDBC接続文字列に ‘autoReconnect = true’を追加してみてください。

2


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

1


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

1


私もこの問題を抱えていました。 私の解決策は次のとおりです。

sc.setSoLinger(true, 10);

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

多分それはすべての人への答えではなく、何人かの人々への答えです。

1


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

0


タイトルとURLをコピーしました