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.
- 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.
- Meistens passiert es, wenn wir auf eine Verbindung schreiben, die am anderen Ende bereits geschlossen ist.
- 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.
- 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.
- Oder die Benutzer navigieren zu einer anderen Seite, bevor die aktuelle Seite vollständig geladen wurde.
- Wir erhalten diesen Fehler auch, wenn unsere Internetverbindung während des Ladens ausfällt.
- 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?
-
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.
-
Wenn der Fehler beim Hochladen großer Ressourcen auftritt, müssen wir unsere API mit einem langen Anforderungs-Timeout in Ordnung bringen.
-
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. -
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. -
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 dieIOException
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.
Verwandter Artikel - Java Exception
- Ausnahme bei ungültiger Eingabe in Java
- Ausnahme im Hauptthread Java.Util.NoSuchElementException: Keine Zeile gefunden
- Ausnahme im Thread AWT-EventQueue-0 java.lang.NullPointerException
- Beheben Sie die Java.Net.BindException: Adresse wird bereits verwendet: Bind
- Der Java-Gateway-Prozess wurde beendet, bevor seine Portnummer gesendet wurde
- Java Throwable vs. Ausnahmeklasse