Keine Benachrichtigung bei Verbindungsabbruch?

  • Themenstarter Themenstarter da1l6
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

da1l6

Gast
Hallo

Habe einen einfachen multi-User Chat geschrieben, der auch soweit funktioniert, aber wenn die Verbindung aufgrund eines Fehlers abbricht (etwa wenn ich testweise einen Client abschieße oder das LAN-Kabel ziehe) dann kommt keine Fehlermelung, das Socket Objekt meldet isConnectd == true und sogar das Senden von Daten mittels
Code:
Socket.getOutputStream().write(data);
wird kommentarlos akzepiert. Nur wenn ich ein
Code:
Socket.getOutputStream().flush();
danach einfüge bekomme ich beim 2. mal senden seit der Unterbrechung eine SocketException: Broken Pipe.

Das kann irgentwie nicht der Weisheit letzter Schluss sein.
Zumal TCP ja schließlich die Übertragungssicherheit garantieren müsste, sodass Daten eben nicht kommentarlos versickern!

Zum Senden dient einfach:
Code:
private void SendData(byte b[]) throws SendDataFaildException {
	try {
		synchronized(ConnectionSocket) {
			ConnectionSocket.getOutputStream().write(b);
			ConnectionSocket.getOutputStream().flush();
		}
	} catch (IOException ex) {
		throw new SendDataFaildException(RemoteHost,ex);
	}
}


So sieht der Code im Thread zum empfangen aus:

Code:
public void run() {
	boolean connected = true;
	InputStream in = null;
	int len = 0;
	byte[] b = null;
	
	synchronized(ConnectionSocket) {
		try {
			in = ConnectionSocket.getInputStream();
		} catch (IOException ex) {
			ConnectionError(ex);
			connected = false;
		}
	} 
	while (!TerminateRequest && connected) {
		synchronized(ConnectionSocket) {
			connected = ConnectionSocket.isConnected() && !ConnectionSocket.isInputShutdown() && !ConnectionSocket.isOutputShutdown();
		}
		if (!connected) {
			ConnectionClosed();
		} else {
			try {
				synchronized(in) {
					len = in.available();
					if (len > 0) {
						b = new byte[len];
						in.read(b);
					}
				}
				
				if (len > 0) {
					DataArrival(b);
				}
			} catch (IOException ex) {
				ConnectionError(ex);
				connected = false;
			}
		}
		
		try {
			Thread.sleep(1);
		} catch (InterruptedException ex) {
		}
	}
}

Hoffe ihr könnt mir helfen!

da1l6


Java: 1.5
OS: KUbuntu Linux 5.10
 
Hallo

Danke für die Antwort

Den Thread hatte ich schon gesehen, leider sehe ich dort keine brauchbare Antwort.
Natürlich meldet sich ein Client, vor Verbindungsende ab. Das funktioniert auch wunderbar, aber es geht mir um den Fall, wenn sich der Client aufgrund eines Fehlers nicht abmelden kann (z.b. wenn er abstürzt).
und ständig ein "Hallo bist du noch da" durch die leitung zu schicken ist auch keine wirklich gute Lösung zumal ich diese Probleme bisher von anderen Programmiersprachen nicht kenne.

Habe tum testen den Client Prozess abgebrochen und TCP Traffic mitgeloggt:
Der Server erhällt in diesem Fall wie es sich gehört ein TCP-FIN Paket über das Verbindungsende, welches auch brav mit einem ACK bestätigt wird.
Das scheint Java aber nicht besonders zu interessieren :!: ???:L
Mehr noch: Es wird sogar noch das Senden zugelassen, und auch das zurückweisen dieses Paketes duch den Empfänger mittels TCP-RET ist für Java kein Grund für eine Exception. :autsch:
Erst der nächste Sendeversuch wird mittels Exception abgeblockt (übrigens ohne das das Paket je gesendet wird) .

Was soll ich davon halten?

da1l6
 
Also mir ist das noch nicht vorgekommen, ich krieg bei sowas immer ne SocketException ???:L

Aber öfter mal ein PING zu schicken, ist ja auch zB im IRC durchaus gängige Praxis.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben