Keine Benachrichtigung bei Verbindungsabbruch?

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
 
D

da1l6

Gast
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
 

Illuvatar

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N websocket - keine Daten mehr nach ca 80 Sekunden Netzwerkprogrammierung 0
T Socket jamod WriteMultipleRegistersRequest ist keine ModBus/TCP Nachricht Netzwerkprogrammierung 1
N Proxy gibt keine Antwort zurück Netzwerkprogrammierung 5
S Socket Applet Client bekommt keine GLOBALE Verbindung zum Server Netzwerkprogrammierung 25
J Nach Dateiversand werden keine Nachrichten mehr übertragen Netzwerkprogrammierung 11
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
A Socket Socket Verbindung unterbrochen --> keine Exception Netzwerkprogrammierung 7
B Client Server Applet keine Ahnung Netzwerkprogrammierung 3
N SFTP apache keine Verbindungaufbau möglich Netzwerkprogrammierung 6
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
H Server und Client-keine verbindung über den localhost Netzwerkprogrammierung 6
K öffnen des socket schlägt fehl -> ABER: keine exception . Netzwerkprogrammierung 2
V Kann keine DatagramPackets versenden von einem Jar Archiv Netzwerkprogrammierung 4
G Browserfenster das keine Remotecontroll zulässt Netzwerkprogrammierung 7
F TCP Socket auf Verbindungsabbruch prüfen Netzwerkprogrammierung 15
Z Socket Server/Client vernünftiger Verbindungsabbruch Netzwerkprogrammierung 4
T Alternative Socket mit Verbindungsabbruch Erkennung Netzwerkprogrammierung 2
T JDBC Verbindungsabbruch (Connection reset) Netzwerkprogrammierung 2

Ähnliche Java Themen


Oben