このスタックトレーススニペットを指定
原因:Java.net.SocketException:ソフトウェアによる接続の中断:ソケット書き込みエラー
at Java.net.SocketOutputStream.socketWrite0(ネイティブメソッド)
私は次の質問に答えようとしました:
#1:について
SunのJVMソースにはこの正確なメッセージは含まれていませんが、テキストはソフトウェアによる接続の中断を引き起こしました:ソケット書き込みエラーはSocketOutputStream
のネイティブ実装からのものです:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
#2について
私の推測では、完全な応答を取得する前に、クライアントが接続を終了したときに発生している(たとえば、リクエストを送信したが、完全な応答を取得する前に、閉じられた/終了した/オフラインになった)
質問:
このスタックトレースがソケットクライアントの「障害」であることを証明する必要があり、サーバーがそれを回避するためにできることは何もありません。 (例外をキャッチするか、Sun JVM以外のSocketOutputStreamを使用することを除きますが、どちらもクライアントが終了したという事実を実際には回避しません)
このエラーは、データの再送信が失敗した後にWinSockが確立された接続を閉じるときなど、ローカルネットワークシステムが接続を中止したときに発生する可能性があります。
このMSDN記事 を参照してください。 「ソフトウェアによる接続の中断」に関する情報 も参照してください。
Java.net.SocketException
は、 a socket ( TCP など)の作成またはアクセスでエラーが発生した場合にスローされます。これは通常、サーバーが接続を(適切に閉じることなく)終了したために、完全な応答を取得する前に発生する可能性があります。ほとんどの場合、これはタイムアウトの問題(応答に時間がかかりすぎる、サーバーが要求で過負荷になっているなど)、またはクライアントがSYNを送信したがACKを受信しなかった(接続終了の確認)が原因で発生します。タイムアウトの問題については、タイムアウト値を増やすことを検討できます。
通常、ソケット例外には、問題に関する特定の詳細メッセージが付属しています。
詳細なメッセージの例:
ソフトウェアにより接続が中断されました:recvが失敗しました。
このエラーは、メッセージを送信しようとし、サーバーによって接続が中止されたことを示しています。データベースへの接続中にこれが発生した場合、これは 互換性のないConnector/J JDBCドライバー の使用に関連している可能性があります。
考えられる解決策:CLASSPATHに適切なライブラリ/ドライバーがあることを確認してください。
ソフトウェアにより接続が中断されました:接続。
これは、リモートへの接続に問題がある場合に発生する可能性があります。たとえば、 ウイルスチェッカーがリモートメール要求を拒否するため です。
考えられる解決策:接続の発信要求のポートをブロックしているかどうか、ウイルススキャンサービスを確認します。
ソフトウェアにより接続が中断されました:ソケット書き込みエラー。
考えられる解決策:正しいバイト長をストリームに書き込んでいることを確認してください。したがって、送信するものを再確認してください。これを参照してください thread 。
ピアによる接続のリセット:ソケット書き込みエラー/ピアによる接続の中止:ソケット書き込みエラー
アプリケーションは、サーバー側でキープアライブ接続がタイムアウトしたかどうかをチェックしませんでした。
考えられる解決策:接続から読み取る前に、HttpClientがNULLでないことを確認してください。E13222_01
ピアによる接続のリセット。
接続はピア(サーバー)によって終了されました。
接続がリセットされました。
接続は、クライアントによって終了されたか、要求との要求のために接続のサーバー側によって閉じられました。
これは、ワークステーション/ラップトップ上の企業のファイアウォールが邪魔になり、接続が切断されるときに最もよく見られます。
例えば。同じマシン上にサーバープロセスとクライアントプロセスがあります。サーバーはすべてのインターフェイス(0.0.0.0)でリッスンしており、クライアントはパブリック/ホームインターフェイス(ループバックインターフェイス127.0.0.1ではないことに注意)への接続を試みます。
マシンのネットワークが切断されている(たとえば、wifiがオフになっている)場合、接続が確立されます。マシンが企業ネットワーク(直接またはvpn)に接続されている場合、接続が形成されます。
ただし、マシンがパブリックWiFi(またはホームネットワーク)に接続されている場合、ファイアウォールは接続を切断します。この状況では、クライアントをループバックインターフェイスに接続すると正常に機能しますが、ホーム/パブリックインターフェイスには接続できません。
お役に立てれば。
どのコンポーネントが失敗するかを証明するために、 wireshark を使用してTCP/IP通信を監視し、実際にポートを閉じているユーザーを確認します。また、タイムアウトも関連します。
Tomcatのソースコードを確認しましたかand JVM source?それはあなたにもっと役立つかもしれません。
あなたの一般的な考え方は良いと思います。接続できなかったシナリオではConnectException
を期待します。上記はクライアント駆動型のように見えます。
単純なクライアントサーバープログラムを使用してこのエラーが発生する場合は、閉じられていない(または閉じられている)入力または出力ストリームの問題です。
私は同じ問題に直面していました。
一般的に、この種のエラーは、クライアントが接続を閉じたために発生し、サーバーはまだそのクライアントで書き込みを試みています。
そのため、サーバーが出力ストリームを完了するまで、クライアントの接続が開いていることを確認してください。
そしてもう1つ、忘れないでください 入力および出力ストリームを閉じます。
お役に立てれば。
そして、まだ問題に直面している場合は、ここで問題の詳細を簡単に説明します。
私の場合、エラーは次のとおりです。
Java.net.SocketException: Software caused connection abort: recv failed
H2データベースにアクセスするJavaアプリケーションのデバッグ中にEclipseで受信されました。エラーの原因は、最初にSQuirreLでデータベースを開いて、整合性を手動で確認したことです。フラグを使用して同じDB(つまりAUTO_SERVER=TRUE
)への複数の接続を有効にしたため、JavaからDBへの接続に問題はありませんでした。
このエラーは、しばらくしてから(長いJavaプロセスです)、SQuirreLを閉じてリソースを解放することにしたときに現れました。 SQuirreLがDBサーバーインスタンスを「所有」するものであり、SQuirreL接続でシャットダウンされたように見えます。
Javaアプリケーションを再起動しても、再びエラーは発生しませんでした。
config
SoapUIクライアントでSOAPサービスをテストしているときにこのエラーが発生しました。基本的に、非常に大きなメッセージ(> 500kb)を取得しようとしていて、SoapUIはタイムアウトによって接続を閉じました。
SoapUIで次の場所に移動します。
ファイル->設定-ソケットタイムアウト(ミリ秒)
...また、180000(3分)などの大きな値を入力すると、ファイルが実際には大きくなりますが、少なくとも応答が返されるため、これは問題の完全な修正にはなりません。