Beheben Sie die Java.Net.SocketException: Connection Reset in Java

Muhammad Zeeshan 12 Oktober 2023
  1. die java.net.SocketException in Java
  2. Ursachen der java.net.SocketException: Connection reset in Java
  3. Reproduzieren Sie den Fehler java.net.SocketException: Connection reset und identifizieren Sie seine Ursachen in Java
  4. Beheben Sie den Fehler java.net.SocketException: Connection reset in Java
Beheben Sie die Java.Net.SocketException: Connection Reset in Java

Der heutige Artikel behandelt die Gründe und Lösungen für den Fehler java.net.SocketException: Connection reset, der in Java auftreten kann. Schließlich werden wir sehen, wie wir den Java-Fehler java.net.SocketException: Connection reset beseitigen können.

die java.net.SocketException in Java

SocketException ist die Unterklasse von IOException. Sein Status als geprüfte Ausnahme ist garantiert.

Beim Versuch, einen Socket zu öffnen oder darauf zuzugreifen, weist die allgemeinste Ausnahme, die auftreten kann, auf ein Problem hin. Sie erhalten die folgende Fehlermeldung, wenn Sie sich die Seite des Servers ansehen:

java.net.SocketException : Connection reset

Ursachen der java.net.SocketException: Connection reset in Java

java.net.SocketException: Connection reset wird auf dem Server ausgelöst, wenn der Client die Verbindung zum Socket beendet, bevor die Antwort über den Socket zurückgesendet werden kann. Angenommen, Sie schließen den Browser, bevor die Antwort vom Server abgerufen wird.

Mit TCP-RST-Paketen teilt Ihnen die Gegenseite mit, dass die Verbindung, auf der das letzte TCP-Paket übertragen wurde, nicht bestätigt wurde. Ein Connection reset zeigt an, dass ein TCP RST erfolgreich empfangen wurde.

Dies könnte daran liegen, dass die Verbindung nicht mehr aktiv ist. Immerhin ist der Hafen geschlossen oder aus anderen Gründen.

Eine einfache Definition eines Reset-Pakets enthält keinen Inhalt und hat das RST-Bit in den TCP-Header-Flags gesetzt. Im Folgenden sind einige der Gründe aufgeführt, warum der Fehler java.net.SocketException: Connection reset auftreten kann:

  1. Der TCP-Socket wurde als Ergebnis des Empfangs eines Schließen-Befehls von einem entfernten System geschlossen.
  2. Dies kann auch durch eine große Anzahl von Anfragen verursacht werden, die vom Server in die Warteschlange gestellt werden, was dazu führt, dass die Anfrage zeitlich begrenzt wird, bevor der Client sie anzeigen kann. Sie können auch den Zustand und die Protokolle des Servers überprüfen, um festzustellen, ob eine hohe Last verursacht wird.
  3. Das Schließen eines Sockets mit ungelesenen Daten im Socket-Empfangspuffer kann ebenfalls zu diesem Fehler führen.
  4. Die Verbindung wurde am anderen Ende absichtlich zurückgesetzt. Während dies für Anwendungssoftware selten und ungeeignet ist, ist kommerzielle Software nicht ungewöhnlich.
  5. Entweder ist das Anwendungsprotokoll falsch, oder Sie haben versucht, auf eine Verbindung zu schreiben, die beendet wurde, bevor Sie fertig waren.

Reproduzieren Sie den Fehler java.net.SocketException: Connection reset und identifizieren Sie seine Ursachen in Java

Beispielcode (Server.java-Datei):

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();
  }
}

Beispielcode (Client.java-Datei):

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());
  }
}

Hier haben wir zwei Klassen, Server.java und Client.java, die sich mit der Portnummer 6666 verbinden. Wir öffnen zwei Terminals und führen beide Dateien aus, um zwischen Client und Server zu kommunizieren, aber es gibt eine Nachricht und einen Fehler wie folgt aus.

Fehlerbeschreibung:

Incorrect String
Exception in thread "main" java.net.SocketException: Connection reset

Lassen Sie uns den Fehler verstehen, indem wir die Schritte Socket, SocketException und SocketException: Connectin reset durchgehen, die zu den Ursachen dieses Fehlers führen.

Wir verwenden Sockets, um eine erfolgreiche Verbindung in zwei oder mehr Programmen herzustellen, um über dasselbe Netzwerk miteinander zu kommunizieren. In unserem Fall haben wir zwei Programme, Client.java und Server.java.

Durch die Verwendung von Sockets erhalten wir eine Schnittstelle, um über den Netzwerkprotokollstapel zu kommunizieren und die Programme Nachrichten über dasselbe Netzwerk austauschen zu lassen.

Mit einfachen Worten können wir sagen, dass Sockets die Endpunkte bei der Kommunikation über ein Netzwerk sind. Normalerweise ist der Socket-Server multithreaded, der von verschiedenen Clients gesendete Socket-Verbindungsanfragen akzeptieren kann.

Die SocketException ist die Kindklasse von IOException, also eine geprüfte Ausnahme. Es tritt auf, wenn wir versuchen, auf den Socket zuzugreifen oder ihn zu öffnen. Sehen Sie sich die vollständige Ausnahmehierarchie für SocketException-Fehler an.

Vollständige Ausnahmehierarchie:

Fix Java Net SocketException Connection Reset in Java - Ausnahmehierarchie

Immer wenn der Client die Socket-Verbindung schließt, führt dies serverseitig zu einer SocketException, da die Antwort noch nicht über diesen Socket zurückgesendet wurde. Ja, du hast es richtig verstanden.

Wir erhalten den Fehler java.net.SocketException: Connection reset auf der Serverseite, wenn der Client die Socket-Verbindung schließt, bevor er die Antwort vollständig erhalten hat.

Connection reset bedeutet hier, dass der entfernte Endpunkt Ihnen mitteilt, dass die Verbindung, auf der das letzte TCP-Paket gesendet wurde, nicht erkannt wird. Dies kann verschiedene Gründe haben.

Lassen Sie uns sie unten finden:

  1. Der Benutzer schließt den Webbrowser, bevor er die Antwort vollständig erhält.

  2. Am häufigsten wurde die Verbindung, die wir zu schreiben versuchen, normal geschlossen. Wir können auch sagen, dass ein Anwendungsprotokollfehler vorliegt.

  3. Eine andere Möglichkeit ist, dass der benötigte Port nicht mehr offen ist. Wir sehen diesen Fehler auch, wenn ein Client den Socket schließt, während sich noch ungelesene Daten in einem Socket-Empfangspuffer befinden.

  4. Wenn Sie ein Windows-Benutzer sind, finden Sie es möglicherweise als Software verursacht einen Verbindungsabbruch. Die Neulinge verwechseln es mit Verbindungsreset.

    Denken Sie daran, beides ist nicht dasselbe. Die Software hat einen Verbindungsabbruch verursacht tritt auf, wenn wir beim Senden von unserer Seite aus einige Netzwerkprobleme haben.

  5. Eine andere Situation ist die Verwendung einer Methode von Java Socket namens setSoTimeout(), die die Option SO_TIMEOUT aktiviert/deaktiviert, indem sie einen Timeout-Wert übergibt, der größer als 0 sein muss. Das Übergeben von 0 ist auch ein Grund, der zum Fehler SocketException: Connection Reset führt.

Jetzt kommt es darauf an, dass wir auch die Verbindung in der Datei Client.java schliessen? Lassen Sie uns das unten finden.

Beheben Sie den Fehler java.net.SocketException: Connection reset in Java

Wenn dieser Fehler als Client beim Herstellen einer Verbindung mit dem Server auftritt, können wir dies beheben, indem Sie einen der folgenden Schritte ausführen:

  1. Stellen Sie sicher, dass der Server über Telnet auf einem Host-Port läuft. Auf diesem Port läuft der Server.
  2. Bestätigen Sie, ob ein Server neu gestartet wird.
  3. Prüfen Sie, ob derselbe Server auf einen anderen Host umschaltet.

Darüber hinaus können wir uns der Lösung nähern, wenn wir die im vorherigen Abschnitt beschriebenen Gründe überwinden. In unserem Fall hat das Entfernen von System.exit(1) den Fehler behoben, weil es das System beendet und das Programm geschlossen hat.

Beispielcode (Server.java-Datei):

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();
  }
}

Beispielcode (Client.java-Datei):

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());
  }
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

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

Verwandter Artikel - Java Error