SocketChannel

smathedark

Mitglied
Hi,

ich erstelle grade einen kleinen Telnetclient in Java. Hierzu baue ich über einen SocketChannel eine Verbindung zur Gegenseite auf. Das funktioniert alles auch wunderbar, wenn ich nun aber die Gegenseite einfach ausschalte (soll Fehler simulieren) merkt mein Client das nicht. Read und Writeoperationen melden keinen Fehler und IsConnected liefert weiterhin true. Wie lässt sich feststellen ob die Gegenseite noch da ist.

Danke schonmal.
 
Sowohl beim Lesen als auch beim Schreiben sollte es entweder eine IOException geben oder als Rückgabewert der Operation eine -1 kommen.

Funktioniert zumindest bei mir zuverlässig.
 
Also bei mir liefert die Readfunktion keine Exception sondern nur eine 0 als Anzahl gelesener Zeichen zurück. Auch die Writefunktion leifert keine Exception. Die Execptions werden bei mir nur ausgelöst, wenn der Socket nie verbunden war.
 
Ok, ich hab das bei mir mal nachkontrolliert. Ich schliesse in meinem Proxy die Channels, wenn eine 0 zurückgegeben wurde.

Code:
try {
	int len = remote.read(dataRToC);	
	
	debug(len + " bytes incoming from remote host");
	
	if (len > 0) {
		dataRToC.flip();				
		
		while (dataRToC.hasRemaining()) {
			client.write(dataRToC);
		}
		dataRToC.clear();
	} else  {
		LOG.info("remote end");
		close();				
	}
}
 
Hi,

leider kann ich den Socket nicht schließen wenn die read funktion eine 0 liefert.
Ich warte auf Ausgaben von anderen Programmen, da kann es schon vorkommen, dass da ne Weile nicht kommt. Ich muss irgentwie entscheiden, ob die Gegenseite noch da ist, nicht ob sie grade mit mir kommunizieren möchte.
 
Sorry, war unterwegs.

Wenn du serverseitig den Channel schliesst, sobald read() eine 0 liefert, musst du doch nur beim Client, wenn er beim nächsten write() eine Exception leifert die Verbindung wieder neu aufbauen.
 
Hallo,

das Problem ist folgendes, der Socket wird nicht regulär geschlossen sondern die Gegenseite wird einfach ausgeschaltet (Strom weg). Das soll einen Fehler im Gerät simulieren, bei dem das Gerät abstürzt. Da nie ein Socket close() erfolgt, wird auch bei read oder write Operationen keine Exception geworfen. Sogar die Funktion isConnected() liefert trotz ausgeschalteter Gegenseite noch true.
 
In dem Fall liefern aber read() und write() jeweils 0 übertragene Bytes zurück, oder?
Dann wäre doch die letzte sinnvolle Möglichkeit, selbst einen Timeout zu implementieren, der nach x Sekunden ohne Übertragung (d.h. 0 übetragenen Bytes) von einem Verbindungsabbruch ausgeht.

Viel mehr fällt mir dann leider nicht mehr ein, da ich im Moment auch keine Testmöglichkeiten habe.
 
Das mit dem Timeout geht natürlich, ist aber leider keine saubere lösung für mich.
Ein Timeout birgt immer die gefahr das es abläuft obwohl noch Daten kommen werden, setzt man die Zeit aber so groß das dies nicht passiert ist es halt wieder zu lange.
Schade das keine saubere Lösung gibt aber vielen Dank für eure Hilfe.
 
Zurück