Hi Leute,
ich habe leider keinerlei passenden Thread gefunden und richte mich deshalb direkt an euch
Erst mal ein paar Hintergrundinfos:
In einem Client-Server-Projekt das als RCP-Applikation mit Eclipse unter Windows programmiert wird, habe ich ein Kommunikationsprotokoll gebaut, dass Objekte serialisiert vom Client zum Server (und andersherum) verschickt.
Der Verbindungsverlust:
Da der Verbindungsverlust nur beim Schreib- oder Leseversuch erkannt werden kann, wird regelmäßig ein Statussignal verschickt. Unter Windows kommt es beim Versenden des Signals zur SocketException falls die Verbindung abgebrochen ist (z.B. WLAN-Empfang weg, zum Test Netzwerkkarte deaktiviert, ...) und wird entsprechend behandelt (Dialog vs. Auto-Reconnect je nach Programmstatus).
Jetzt zur eigentlichen Frage:
Unter Linux sendet der Socket am Client auch nach deaktivieren der LAN-Verbindung fröhlich weiter Nachrichten, die ins Nirvana laufen. Nach ca. 3-5 Minuten kommt dann erst eine TimeoutException die auch entsprechend abgefangen wird.
Ist die Implementierung der Sockets in der JVM unter Linux anders aufgebaut? Wie kann ich den Verbindungsverlust früher erkennen? (unter Windows erfolgt die Erkennung beim nächsten Zugriff)
Die Methode readObject() liest, falls vorhanden, das empfangene Objekt vom InputStream. writeMessages() sendet alle in der Queue befindlichen Nachrichten. Falls lange keine Nachricht verschickt wurde, wird ein "Heartbeat" gesendet um die Verbindung auf Gültigkeit zu prüfen.
Vielen Dank im Voraus Ich hoffe ihr könnt mir eine gute Idee geben, woran es unter Linux liegt.
Grüße,
Bernau
ich habe leider keinerlei passenden Thread gefunden und richte mich deshalb direkt an euch
Erst mal ein paar Hintergrundinfos:
In einem Client-Server-Projekt das als RCP-Applikation mit Eclipse unter Windows programmiert wird, habe ich ein Kommunikationsprotokoll gebaut, dass Objekte serialisiert vom Client zum Server (und andersherum) verschickt.
Der Verbindungsverlust:
Da der Verbindungsverlust nur beim Schreib- oder Leseversuch erkannt werden kann, wird regelmäßig ein Statussignal verschickt. Unter Windows kommt es beim Versenden des Signals zur SocketException falls die Verbindung abgebrochen ist (z.B. WLAN-Empfang weg, zum Test Netzwerkkarte deaktiviert, ...) und wird entsprechend behandelt (Dialog vs. Auto-Reconnect je nach Programmstatus).
Jetzt zur eigentlichen Frage:
Unter Linux sendet der Socket am Client auch nach deaktivieren der LAN-Verbindung fröhlich weiter Nachrichten, die ins Nirvana laufen. Nach ca. 3-5 Minuten kommt dann erst eine TimeoutException die auch entsprechend abgefangen wird.
Ist die Implementierung der Sockets in der JVM unter Linux anders aufgebaut? Wie kann ich den Verbindungsverlust früher erkennen? (unter Windows erfolgt die Erkennung beim nächsten Zugriff)
Java:
try{
// while connected && ( connection not canceled OR something to send in queue)
while(!destination.isClosed() && (!canceled || writeQueue.size()>0)){
//wait for content
try {
//check for new messages
if(is.available()>0){
readObject();
}
//write messages to server
writeMessages();
} catch (ConnectException e) {
Logger.getLogger(getClass()).warn("Verbindung verloren", e);
connectionClosedReason = LOST_CONNECTION;
break; // connection lost
} catch (SocketException e) {
Logger.getLogger(getClass()).warn("Verbindung verloren", e);
connectionClosedReason = LOST_CONNECTION;
break; //connection closed
} catch (IOException e) {
Logger.getLogger(getClass()).error("Fehler in der Kommunikation", e);
connectionClosedReason = COMMUNICATION_ERROR;
break;
}
//check connectivity
long now = new GregorianCalendar().getTimeInMillis();
long diff = now-lastAction;
if( diff >= timeout){
//send heartbeat if connection has been idle for a long time
sendStatus(STATUS_ACTIVE);
}
//wait
sleep(50);
}
}catch (Exception e) {
Logger.getLogger(getClass()).error("Unerwarteter Fehler", e);
connectionClosedReason = UNEXPECTED_ERROR;
}
Die Methode readObject() liest, falls vorhanden, das empfangene Objekt vom InputStream. writeMessages() sendet alle in der Queue befindlichen Nachrichten. Falls lange keine Nachricht verschickt wurde, wird ein "Heartbeat" gesendet um die Verbindung auf Gültigkeit zu prüfen.
Vielen Dank im Voraus Ich hoffe ihr könnt mir eine gute Idee geben, woran es unter Linux liegt.
Grüße,
Bernau