Java.Net.SocketException: Connection Reset in Java を修正します。
- 
          
            Java の java.net.SocketException
- 
          
            Java での java.net.SocketException: Connection resetの原因
- 
          
            java.net.SocketException: Connection resetエラーを再現し、Java でその原因を特定する
- 
          
            Java の java.net.SocketException: Connection resetエラーを修正する
 
本日の記事では、Java で発生する可能性がある java.net.SocketException: Connection reset エラーの理由と解決策について説明します。 最後に、Java の java.net.SocketException: Connection reset エラーを根絶する方法について説明します。
Java の java.net.SocketException
    
SocketException は IOException のサブクラスです。 チェック例外としてのステータスが保証されます。
ソケットをオープンまたはアクセスしようとしたときに発生する可能性がある最も一般的な例外は、問題があることを示しています。 サーバー側を見ると、次のエラーが表示されます。
java.net.SocketException : Connection reset
Java での java.net.SocketException: Connection reset の原因
java.net.SocketException: Connection reset は、クライアントがソケットへの接続を終了したときに、ソケットを介して応答が返される前にサーバーでスローされます。 サーバーから応答が取得される前にブラウザーを閉じる可能性があるとします。
TCP RST パケットは、最後の TCP パケットが送信された接続が確認されていないことをリモート側が通知する方法です。 接続リセット は、TCP RST が正常に受信されたことを示します。
これは、接続がアクティブでなくなったことが原因である可能性があります。 結局のところ、ポートが閉じられているか、その他の理由があります。
リセット パケットの単純な定義には、内容が含まれておらず、TCP ヘッダー フラグに RST ビットが設定されています。 以下は、java.net.SocketException: Connection reset エラーが発生する理由の一部です。
- リモート システムから closeコマンドを受信した結果、TCP ソケットが閉じられました。
- これは、大量のリクエストがサーバーによってキューに入れられていることによっても発生する可能性があります。これにより、クライアントがリクエストを表示する前にリクエストがタイムアウトになります。 サーバーの状態とログを確認して、高負荷が発生しているかどうかを確認することもできます。
- ソケット受信バッファに未読のデータがあるソケットを閉じると、このエラーが発生する可能性があります。
- 相手側で意図的に接続がリセットされました。 これはまれであり、アプリケーション ソフトウェアには不適切ですが、商用ソフトウェアは珍しくありません。
- アプリケーション プロトコルが正しくないか、終了する前に終了した接続に書き込もうとしました。
java.net.SocketException: Connection reset エラーを再現し、Java でその原因を特定する
コード例 (Server.java ファイル):
package com.demobrokenpipe;
import java.io.*;
import java.net.*;
public class Server {
  public static void main(String[] args) throws Exception {
    ServerSocket socket = new ServerSocket(6666);
    System.out.println("The Server Is Initialized");
    Socket conn = socket.accept();
    System.out.println("A Request Is Received");
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    System.exit(1);
    conn.close();
  }
}
コード例 (Client.java ファイル):
package com.demobrokenpipe;
import java.io.*;
import java.net.*;
public class Client {
  public static void main(String argv[]) throws Exception {
    Socket socket = new Socket("localhost", 6666);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.write("Hi");
    System.out.println("Incorrect String");
    BufferedReader bufferReader =
        new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println(bufferReader.read());
  }
}
ここでは、ポート番号 6666 に接続する Server.java と Client.java の 2つのクラスがあります。 2つのターミナルを開き、クライアントとサーバーの間で通信するために両方のファイルを実行しますが、次のようなメッセージとエラーが出力されます。
エラーの説明:
Incorrect String
Exception in thread "main" java.net.SocketException: Connection reset
このエラーの原因となる Socket、SocketException、SocketException: Connectin reset を見てエラーを理解しましょう。
ソケットを使用して、2つ以上のプログラムで接続を成功させ、同じネットワークを使用して相互に通信します。 私たちの場合、Client.java と Server.java の 2つのプログラムがあります。
ソケット を使用することで、ネットワーク プロトコル スタックを介して通信するためのインターフェイスを取得し、プログラムが同じネットワーク上でメッセージを共有できるようにします。
簡単に言えば、ソケットはネットワークを介した通信のエンドポイントであると言えます。 通常、ソケット サーバーはマルチスレッド化されており、さまざまなクライアントから送信されたソケット接続要求を受け入れることができます。
SocketException は IOException の子クラスなので、チェック例外です。 ソケットにアクセスまたは開こうとすると発生します。 SocketException エラーの完全な例外階層を見てください。
完全な例外階層:

クライアントがソケット接続を閉じると、そのソケットを介してまだ応答が返されていないため、サーバー側で SocketException が発生します。 はい、正解です。
クライアントが応答を完全に受信する前にソケット接続を閉じると、サーバー側で java.net.SocketException: Connection reset エラーが発生します。
ここで、接続のリセットは、最後の TCP パケットが送信された接続が認識されないことをリモート エンドポイントが通知することを意味します。 これにはさまざまな理由が考えられます。
以下でそれらを見つけてみましょう。
- 
ユーザーは、応答を完全に取得する前に Web ブラウザーを閉じます。 
- 
ほとんどの場合、書き込もうとしている接続は正常に閉じられています。 アプリケーション プロトコル エラーがあるとも言えます。 
- 
別の可能性として、必要なポートが開かれていない可能性があります。 また、未読データがソケット受信バッファにある間にクライアントがソケットを閉じた場合にも、このエラーが発生します。 
- 
Windows ユーザーの場合、 ソフトウェアが原因で接続が中止されましたと表示されることがあります。 初心者は接続のリセットと混同します。どちらも同じではないことに注意してください。 ソフトウェアが原因で接続が中止されましたは、送信中にネットワークの問題が発生した場合に発生します。
- 
もう 1つの状況は、 setSoTimeout()と呼ばれる JavaSocketのメソッドを使用して、0より大きくなければならないタイムアウト値を渡すことによってSO_TIMEOUTオプションを有効/無効にすることです。0を渡すことも、SocketException: Connection Resetエラーの原因になります。
ここで重要なのは、Client.java ファイルでも接続を閉じているということですか? 以下でそれを見つけてみましょう。
Java の java.net.SocketException: Connection reset エラーを修正する
サーバーとの接続中にクライアントとしてこのエラーが発生した場合は、次のいずれかを実行してこれを修正できます。
- サーバーがホスト ポートで telnet 経由で実行されていることを確認します。 このポートは、サーバーが実行される場所です。
- サーバーが再起動されるかどうかを確認します。
- 同じサーバーが別のホストにフェイルオーバーするかどうかを評価します。
さらに、前のセクションで説明した理由を克服すれば、解決策に進むことができます。 私たちの場合、System.exit(1) を削除すると、システムを終了してプログラムを閉じるため、エラーが修正されました。
コード例 (Server.java ファイル):
import java.io.*;
import java.net.*;
public class Server {
  public static void main(String[] args) throws Exception {
    ServerSocket socket = new ServerSocket(6666);
    System.out.println("The Server Is Initialized");
    Socket conn = socket.accept();
    System.out.println("A Request Is Received");
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    System.out.println(reader.readLine());
    conn.close();
  }
}
コード例 (Client.java ファイル):
import java.io.*;
import java.net.*;
public class Client {
  public static void main(String argv[]) throws Exception {
    Socket socket = new Socket("localhost", 6666);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.write("Hi");
    System.out.println("Incorrect String");
    BufferedReader bufferReader =
        new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println(bufferReader.read());
  }
}
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn