PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Verbindungsabbruch erkennen?



MJA
28.06.2005, 16:37
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.

PicNick
28.06.2005, 16:47
Ganz allgemein isses bei Socken so, daß du erst dann eine Fehlermeldung bekommst, wenn du in receive() bist.

MJA
28.06.2005, 21:25
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.

PicNick
29.06.2005, 08:30
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
:D

MJA
29.06.2005, 16:32
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.

PicNick
29.06.2005, 16:40
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.

PicNick
29.06.2005, 16:49
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.

MJA
04.07.2005, 14:20
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:

if(inputMessage != null)
{
...;
}
else
continue;

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 "".
Naja, auf jeden Fall gehts jetzt.
Danke trotzdem!

Gruß,
Jan.

PicNick
04.07.2005, 14:26
Ich find's super, daß du diese (Selbst-)Lösung gepostet hast, dadurch haben alle was davon gelernt.

MJA
04.07.2005, 21:14
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.

pebisoft
05.07.2005, 17:04
sag mal kannst du deine scheiss "neustart-meldung" nicht rauslassen.
ausserdem sind wir keine "hi leute". verwende mal eine vernünftige anrede wenn du hilfe brauchst.
mfg pebisoft

PicNick
05.07.2005, 17:13
@pebi, das war jetzt vollkommen überflüssig.

Mir ist "Hi Leute" wesentlich lieber
als "sch....-Meldung"

Der Thread ist längst gelaufen. Warum willst du da rum-motzen ?

MJA
10.07.2005, 21:49
Besser, als wenn man die Leute, von denen man was will gar nicht begrüßt. (wie gewisse leute die hier rummeckern)
Außerdem, was hast du mit dem Thema zu tun?! Der Thread is gelaufen und das gehört überhaupt nicht ins Thema. Wenn du ein Problem mit meiner Signatur hast, schreib mir eine PN oder beschwer dich bei nem Moderator.
Wär dir die Begrüßung "Hi pebisoft, Hallo alle andern" lieber?!