このスタックトレースのスニペットを見ると
原因: java.net.SocketException: ソフトウェアにより接続が中止されました:
java.net.SocketOutputStream.socketWrite0(ネイティブ メソッド) でのソケット書き込みエラー
私は以下の質問に答えようとしました:
- この例外をスローしているコードは何ですか? (JVM?/Tomcat?/私のコード?)
- この例外がスローされる原因は何ですか?
1に関して:
SunのJVMソースにはこのメッセージは正確には含まれていないが、テキストはソフトウェアにより接続が中断されました: ソケット書き込みエラーは、次のネイティブ実装からのものですSocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
2に関して
私の推測では、これはクライアントが完全な応答を取得する前に接続を終了したときに発生するものです (たとえば、リクエストを送信したが、完全な応答を取得する前に、閉じられたり、終了したり、オフラインになったりする)。
質問:
- 上記の仮定 (#1 と #2) は正しいでしょうか?
- これは、「ネットワークエラーのため、クライアントに書き込むことができませんでした」という状況と区別できますか?サーバ側」ですか?それとも同じエラーメッセージが表示されますか?
- そして最も重要なのは:上記を記載した公式文書(例:Sun からのもの)はありますか?
このスタック トレースがソケット クライアントの「障害」であり、サーバーがこれを回避するために実行できる手段が何もないという証拠が必要です。(例外をキャッチするか、Sun JVM 以外の SocketOutputStream を使用する以外は、どちらもクライアントが終了したという事実を実際に回避することはできません)
ベストアンサー1
このエラーは、データの再送信が失敗した後に WinSock が確立された接続を閉じる場合など、ローカル ネットワーク システムが接続を中止したときに発生する可能性があります (受信側がデータ ストリーム ソケットで送信されたデータを確認しない場合)。