wie kann man feststellen, ob eine socket, in die man gerade daten schreiben will, nicht schon von der gegenseite geschlossen wurde? java ist sich nämlich zu fein, da eine exception zu werfen.
hier ist mein code:
PrintWriter out = new PrintWriter(comSocket.getOutputStream());
out.println(„hallo hallo!“);
wie kann man feststellen, ob eine socket, in die man gerade
daten schreiben will, nicht schon von der gegenseite
geschlossen wurde? java ist sich nämlich zu fein, da eine
exception zu werfen.
Äh, doch?
Zumindest bei TCP/IP-Sockets (nicht bei UDP) bekommst du normalerweise eine IOException zurück, wenn die Verbindung von einer der beiden Seiten beendet wurde. Benutzt du wirklich den Socket für die Ausgabe und hast nicht vielleicht einen BufferedWriter/OutputStream dazwischen, oder sowas? Die verzögern nämlich die Ausgabe…
TCP baut eine verlässliche Verbindung zur anderen Seite auf. Wenn die unterbrochen wird (selbst duch Kabel rausziehen), dann stellen beide Seiten das spätestens nach einer kurzen Wartezeit fest - und das wird dann an die höheren Schichten, also auch an die Java-API weitergeleitet.
UDP dagegen kennt keine Verbindung. Wenn der Socket auf der Gegenseite nicht ansprechbar ist - was soll’s? Eben ein Datenpaket weniger auf der Welt …
Bei TCP musst du eine Exception bekommen. Ich kann mir eben nur vorstellen, dass deine Schreibzugriffe verzögert werden und du deshalb NOCH keine Exception erhältst.
Zumindest bei TCP/IP-Sockets (nicht bei UDP) bekommst du
normalerweise eine IOException zurück, wenn die Verbindung von
einer der beiden Seiten beendet wurde. Benutzt du wirklich den
Socket für die Ausgabe und hast nicht vielleicht einen
BufferedWriter/OutputStream dazwischen, oder sowas? Die
verzögern nämlich die Ausgabe…
ok, ich benutz nen bufferedwriter aber ich flush immer ganz brav, wenn ich eine zeile geschrieben hab!
naja, ich hab das jetzt mal ohne den bufferedwriter umgeschrieben und jetzt funktioniert das. also besten dank! aber komisch find ich das dennoch…
naja, ich hab das jetzt mal ohne den bufferedwriter
umgeschrieben und jetzt funktioniert das. also besten dank!
aber komisch find ich das dennoch…
Wenn der Socket bereits geschlossen wurde und du beim BW.flush() keine Exception bekommst (merkwürdig sollte das schon sein), dann vielleicht, wenn du am Ende ein BW.close() aufrufst?
Bei Writern weiß ich nicht, ob diese für die darunter liegende Schicht dann auch close() aufrufen oder nicht. Für Streams ist das ein spezifiziertes „Ja!“. Wenn du es also einrichten kannst, einen BufferedOutputStream statt eines BufferedWriters zu benutzen, dann wirst du spätestens beim Aufruf des close() eine IOException bekommen, wenn der Socker vorher schon geschlossen wurde.
Die java.io.Buffered* Klassen verbessern zwar i.A. ganz gut die Performance (schon mal eine große Datei zeichenweise eingelesen und verglichen?), aber sie fügen natürlich auch eine weitere Zwischenschicht hinzu, die durch ihre Schreib-/Leseverzögerung durchaus merkwürdige Fehler hervorrufen kann.
Insofern sollten natürlich auch diese Klassen mit Bedacht eingesetzt werden…