Ganz allgemein isses bei Socken so, daß du erst dann eine Fehlermeldung bekommst, wenn du in receive() bist.
Hi Leute.
Ich hab da mal ne relativ simple Frage (ich hoffe, dass sie das ist).
Und zwar, wie kann ich in Java bei einem Socket (java.net.Socket, also Client-seitig) erkennen wenn die Verbindung unterbrochen wurde. Ja, ich weiß, mann kann den Status über isConnected() abfragen, etc., aber der Socket gibt auch dann nur "true" zurück, wenn die Verbindung schon unterbrochen wurde. Beispiel:
Ich verbinde mich mit dem Hyperterminal zu einem ServerSocket. Die accept()-Methode des ServerSockets gibt ja bei einer eingehenden Verbindung einen Client-Socket zurück, welcher dann zum Kommunizieren verwendet werden kann.
Wenn ich das Hyperterminal dann einfach schließe oder auf "Trennen" klicke, gibt der Socket aber als Status immernoch verbunden zurück.
Wie kann ich das also erkennen?
Wäre dankbar für einen Lösung!
Gruß,
Jan.
irOS - independent robot operating system
www.ir-os.de
Ganz allgemein isses bei Socken so, daß du erst dann eine Fehlermeldung bekommst, wenn du in receive() bist.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi.
Hm... de Methode receive() gibt es in Java zwar meines Wissens nicht. Aber falls du meinst, dass er den hereinkommenden Stream lesen soll, da kann ich ja ewig warten, schließlich sendet der andere Socket nichts mehr.
Wie würdest du das den feststellen?
Gruß,
Jan.
irOS - independent robot operating system
www.ir-os.de
Wie gesagt, ich geh' vom Normal-Socken Verhalten aus. Es ist Aufgabe des Netzwerk, beim Warten auf Daten ggf. eine Fehlermeldung abzusetzen. eine explizite Exception / Callback definition gibt's ja nicht, also muß es eine Methode / function sein, die einen Error-Code liefern kann. Als nicht Javaner kann ich dir leider nicht sagen, auf welche weise du zu daten kommst. Aber genau da sollte die musik spielen.
Wie gesagt, einen disconnect festzustellen, ist sache des Netzwerk.
Es hilft wahrscheinlich nur Lesen, ev. auch bei TELNET schauen, denn darüber läuft ja Hyperterm (mit IP)
Vielleicht krieg ich noch was raus, aber wenn du als unser Java-Guru Schwächen zeigst, wird's für andere noch schwieriger
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Was heißt hier Java-Guru?? Ich bin blutiger Anfänger! Ok, ich pirsche mich langsam an den Status eines Hobby-Programmiers an, aber mehr auch nicht. Naja, egal.
Lesen geht ja bei Java über InputStreams, bzw. über einen Reader, der diesen ausließt. Das Problem an der Sache ist, dass ich einen BufferedReader verwende, das heißt er puffert die Eingabe so lange, bis ein Zeilumbruch gesendet wird. Und da ich den wiederum in einer Endlos-Schleife laufen lasse, blockt er solange, bis eine Eingabe kommt. Jetzt kommt natürlich der Vorschlag: "Nimm doch einen ungepufferten Reader!". Das wäre für mich aber viel komplizierter... und ich würde gerne ohne auskommen, wenns geht.
Ich hatte gehofft, dass es hier noch jemanden außer mir gibt, der sich mit Netzwerkprogrammierung unter Java einigermaßen auskennt.
Bis denn, Gruß,
Jan.
irOS - independent robot operating system
www.ir-os.de
Dann schau dir den bufferedReader nochmal an, was es in dieser Richtung zu wissen gibt. Da müßt schon irgendwas in der Richtung da sein, sonst könnt' es ja kein Ferkel brauchen, das glaub ich nicht.
Vielleicht find ich auch was, mal sehen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Zwischenfrage: Du verwendest aber nicht UDP (connectionless) sondern TCP ?
EDIT:
Du müßtest beim Lesen des Buffers eigentlich die Länge der Daten zurückkriegen. Wenn das so ist und die Länge NULL ist, ist die Verbindung futsch.
Hi.
Ich verwende TCP. Aber das Problem hat sich schon gelößt, ich hab mir selbst das Bein gestellt . Und zwar hatte ich eine if-Abfrage gemacht die lautete:
Ich wollte so verhindern, dass eine leere Nachricht weitergegeben wird, ist ja klar. Nur bin ich nicht auf die Idee gekommen, dass das nur dann, und auch nur dann passiert, wenn die Verbindung abgebrochen wird. Wenn du zum Beispiel einfach "Enter" drückst, also eine leere Nachricht sendest, ist diese nicht null sondern "".Code:if(inputMessage != null) { ...; } else continue;
Naja, auf jeden Fall gehts jetzt.
Danke trotzdem!
Gruß,
Jan.
irOS - independent robot operating system
www.ir-os.de
Ich find's super, daß du diese (Selbst-)Lösung gepostet hast, dadurch haben alle was davon gelernt.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ist doch klar!
Ich will mein Wissen doch niemandem vorenthalten! Ich helfe gerne.
Aber man muss auch sagen, dass das ein doch recht dummer Fehler war, ich hab mich schließlich selbst ausgetrickst Naja, aber jetzt passiert es anderen vielleicht nicht so leicht.
Gruß,
Jan.
irOS - independent robot operating system
www.ir-os.de
Lesezeichen