2013-02-21 8 views
6

Also schrieb ich einen Thread auf meiner Client-Seite, die versucht, readObject() aus einem Socket-Stream.Java - readObject() und setSoTimeout()

Dieser Thread wird ausgeführt, solange der Client verbunden ist.

Die Verbindung zum Server kann auf der GUI des Clients geschlossen werden. Wenn der Client die Verbindung trennt (dies beendet das Client-Programm nicht), indem er auf die Menüoption "Disconnect" klickt, wird der Socket geschlossen und isConnected wird auf false gesetzt.

Da die Kunden Thread versucht zu readObject() aus dem Strom zu lesen, während die Verbindung über die GUI geschlossen werden, habe ich ein Timeout auf 250 ms (setSoTimeout(250)).

@Override 
public void run() 
{ 
    this.connection = this.connectionHandler.getSocket(); 
    while(connectionHandler.isConnected()) 
    { 
    this.readCircle(); 
    } 
    this.connectionHandler.setReadTaskRunning(false); 
} 

private void readCircle() 
{ 
    try 
    { 
    this.connection.setSoTimeout(250); 
    this.connectionHandler.readData(); //this uses readObject(). 
    } 
catch(SocketTimeoutException timeout){} 
catch(...){} 

}

Ich weiß, dass readObject() blockiert, und zu überprüfen, ob der Client noch verbunden ist, ich es in einem while, wraped die überprüft (alle Timeout), wenn das Client-Socket noch angeschlossen ist.

Meine Frage ist jetzt:

Im Fall, wenn die readObject() beginnt ein Objekt durch den Server übergeben werden, versucht, es zu lesen, aber während der Verarbeitung ein Timeout auftritt, werden die Daten auf dem Strom werden „beschädigt“ in gewisser Weise, weil es abgebrochen hat. Oder sollte ich nur die readObject() blockieren und fangen eine Ausnahme, wenn der GUI-Thread den Socket schließen will.

Ich bin nicht sehr erfahren mit Sockets und vielleicht ist mein Ansatz überhaupt falsch.

+1

isConnected() gibt nicht false zurück, wenn der Peer die Verbindung getrennt hat. Sie müssen EOFException fangen und behandeln. – EJP

+0

Ja, Sie haben Recht.Am 'catch (...) {}' muss ich eine Reihe von Ausnahmen abfangen. Die 'EOFException' catch ruft' 'forceDisconnect()' auf, um die Ressourcen auf der Clientseite zu schließen und auch die GUI-Elemente für den Benutzer. – Hexa

Antwort

2

Socket-Lese-Timeout führt dazu, dass SocketTimeoutException von readObject() ausgelöst wird. Sie können das ObjectInputStream möglicherweise nicht wiederverwenden, und der Stream kann beschädigt werden, da seine aktuelle Position weitgehend undefiniert bleibt.

Dies kann wahrscheinlich nur durch Schließen und erneutes Öffnen der Verbindung behoben werden.