1. ホーム
  2. java

[解決済み] "ソフトウェアによる接続の中断: ソケット書き込みエラー "の正式な理由

2022-01-29 04:45:08

質問

このスタックトレースのスニペットがある場合

原因:java.net.SocketException: ソフトウェアが原因で接続が中断されました。 ソケット書き込みエラー
 で java.net.SocketOutputStream.socketWrite0(ネイティブ メソッド)

以下の質問に答えてみました。

  1. この例外はどのようなコードで発生するのですか?(JVM?/Tomcat?/私のコード?)
  2. この例外を発生させる原因は何ですか?

1について。

SunのJVMのソースには、この正確なメッセージは含まれていませんが、私は、テキスト ソフトウェアが接続を中断させた: ソケット書き込みエラー のネイティブ実装に起因するものです。 SocketOutputStream :

private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
                 int len) throws IOException;

その2について

私の推測では、クライアントが完全なレスポンスを得る前に接続を終了した場合に発生すると思われます(例:リクエストを送信したが、完全なレスポンスを得る前に、クローズ/終了/オフラインになった)。

質問です。

  1. 上記の仮定は正しいですか(#1、#2)?
  2. のネットワークエラーにより、クライアントに書き込むことができなかった」という状況と区別することができますか? サーバー それとも同じエラーメッセージが表示されるのでしょうか?
  3. そして最も重要なこと。 上記を記載した公式文書(例:Sunからの文書)はありますか?

このスタックトレースがソケットクライアントの誤りであり、サーバーがこれを回避するためにできることは何もなかったという証明が必要なんです。(例外をキャッチするか、Sun JVM以外のSocketOutputStreamを使用することを除いて、しかし、両方ともクライアントが終了した事実を本当に回避することはできません)。

解決方法は?

<ブロッククオート

このエラーは、ローカルネットワークシステムが WinSockが確立された接続を閉じた場合など。 データの再送信に失敗した後(受信者は送信されたデータを確認することはない を使用した場合)。

参照 このMSDN記事 . 以下もご参照ください。 Software caused connection abort」に関する一部情報 .