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.
isConnected() gibt nicht false zurück, wenn der Peer die Verbindung getrennt hat. Sie müssen EOFException fangen und behandeln. – EJP
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