Java.Net.SocketException behoben: Pipe-Fehler in Java

Mehvish Ashiq 12 Oktober 2023
Java.Net.SocketException behoben: Pipe-Fehler in Java

Dieses Tutorial demonstriert den Fehler java.net.SocketException: Broken pipe mithilfe der Java-Programmierung und zeigt seine möglichen Ursachen und Lösungen auf.

Fehlerbeschreibung, Gründe und Lösungen

Es ist wichtig, den Fehler zu kennen, bevor Sie seine Gründe ausgraben und Lösungen finden. Beginnen wir also mit der Fehlerdemonstration, bei der wir die dynamische Puffergröße an einen Socket-Stream senden müssen, was gut funktioniert.

Der Fehler tritt auf, wenn wir versuchen, mehr als einen Puffer mit einer Größe zu senden, die größer ist als die int myBufferSize = 18 * 1024; (es ist ein Richtwert).

Beispielcode:

byte[] bs = new byte[myBufferSize];
while (...) {
  fileInputStream.read(bs);
  byte[] bufferToSend = new byte[sizeBuffer];
  DataOutputStream dataOutputStream = new DataOutputStream(client.getoutputStream());
  dataOutputStream.writeInt(bufferToSend.length);
  dataOutputStream.write(bufferToSend);
  dataOutputStream.flush();
}

Fehlerbeschreibung:

java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)

Was bedeutet das kaputte Rohr? Die defekte Pipe bedeutet, dass eine Maschine versucht, Daten in eine Pipe zu schreiben/aus ihr zu lesen, während eine Maschine auf der anderen Seite einer Pipe beendet wurde.

Da die Verbindung beendet ist, muss jede neue Verbindung aufgebaut werden, um die Daten zu übertragen. Andernfalls würde die Datenübertragung eingestellt.

Denken Sie daran, dass Java keine spezielle BrokenPipeException hat.

Diese Art von Fehler würde sichtbar in die verschiedenen Ausnahmen eingeschlossen, zum Beispiel IOException und SocketException. In unserem Fall wird die defekte Leitung in SocketException verpackt.

Warum bekommen wir dieses Problem und wie können wir es lösen? Einige der häufigsten Ursachen sind im folgenden Abschnitt aufgeführt.

Gründe für den Fehler java.net.SocketException: Broken pipe in Java

Dieser Fehler kann auftreten, wenn einer der folgenden Fälle eintritt.

  1. Dieser Fehler tritt zeitweise auf, wenn sich mehrere Clients mit einem Server verbinden und mehrere Clients ihre Verbindung schließen, bevor die Antwort vollständig bereitgestellt/übertragen wurde.
  2. Meistens passiert es, wenn wir auf eine Verbindung schreiben, die am anderen Ende bereits geschlossen ist.
  3. Es kann auch auftreten, wenn ein Peer eine Verbindung schließt, ohne die gesamten an seinem Ende anstehenden Daten zu lesen. In einem anderen Fall ergreift der Peer eine absichtliche Aktion zum Zurücksetzen, anstatt die Verbindung ordnungsgemäß zu schließen.
  4. Der Benutzer schließt den Browser, bevor eine Seite vollständig geladen ist, was zu einer unerwarteten Trennung der Clientsitzung für einen Server führt.
  5. Oder die Benutzer navigieren zu einer anderen Seite, bevor die aktuelle Seite vollständig geladen wurde.
  6. Wir erhalten diesen Fehler auch, wenn unsere Internetverbindung während des Ladens ausfällt.
  7. Eine andere Situation für diesen Fehler ist, wenn ein Browser eine Zeitüberschreitung für eine Verbindungsanforderung beendet hat. Meistens tritt es auf, wenn wir versuchen, große Ressourcen hochzuladen.

Mögliche Lösungen zur Beseitigung des Fehlers java.net.SocketException: Broken pipe in Java

Wir können diesen Fehler bei der Client-Server-Programmierung auf verschiedene Weise beseitigen. Wollen wir die Grundursache ignorieren oder behandeln, um die Entwickler darüber zu informieren?

  1. Im Allgemeinen ist die Behandlung dieser Art von Fehlern für Serveranwendungen erforderlich, damit unser Server nicht durch andere Clients beeinträchtigt wird. Ja, als Support-Person können wir dies ignorieren, da der Client bereits getrennt wird, bevor die Daten/Antwort vollständig übertragen wurden.

  2. Wenn der Fehler beim Hochladen großer Ressourcen auftritt, müssen wir unsere API mit einem langen Anforderungs-Timeout in Ordnung bringen.

  3. Manchmal erledigen Port-Scanner ihre Aufgabe, indem sie eine Verbindung öffnen und sofort wieder schließen. Unser Server ist nicht darauf programmiert, den Verbindungsausfall zu verarbeiten.

    Das liegt daran, dass wir für diese Situation nicht programmiert haben. Hier müssen wir try-catch verwenden, um mit dieser Situation umzugehen.

  4. Das Problem mit dem Rohrbruch liegt auf der anderen Seite, nicht im Code. Wahrscheinlich versteht das andere Ende (es kann der Client oder der Server sein) unser Längenwortprotokoll nicht.

    Implementiert das zum Beispiel nicht richtig. Wenn es sich um etwas Ähnliches wie diesen Code handelt (der in der Fehlerdemonstration bereitgestellt wird), wird dies nicht der Fall sein.

    Wir ignorieren die von read() zurückgegebene Antwort. Nehmen Sie außerdem an, dass es den Puffer füllt; Es ist nicht angegeben, dies zu tun, nur ein Byte zu senden / zu übertragen.

  5. Eine andere Lösung besteht darin, den Code dort zu überprüfen, wo die Input/Output-Ausnahme auftritt, und diesen mit einem try-catch-Block zu umschließen, um die IOException abzufangen. Dann liegt es an uns, zu entscheiden, wie wir mit diesem halbgültigen Szenario umgehen.

    Denken Sie daran, dass dieser Fall nur zutrifft, wenn die defekte Pipe um die IOException gewickelt ist.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Verwandter Artikel - Java Exception