Ich habe folgendes Problem: Ich programmiere gerade eine Client-Server-Anwendung und realisiere die Netzwerkverbindung über Sockets. Nun habe ich aber folgendes Problem: Ich habe die Behandlung der Netzwerk-Verbindung in eine eigene Thread-Klasse ausgelagert, so dass die Oberfläche des Clients nicht blockiert wird. Alle Zugriffe von der Verbindung auf die Oberfläche sind über javax.swing.SwingUtilities.invokeLater(Runnable doRun) realisiert. Trotzdem blockiert der Empfang der Daten (Siehe Code-Ausschnitt der Thread-Klasse) die Oberfläche.
Zur Erklärung: this.in ist der InputStream des Client-Sockets
Und zwar steht die Oberfläche ca. alle 10 Sekunden für 2 Sekunden. Wenn ich die Klammer mit this.in.available() entferne, tritt der Effekt nicht auf. Allerdings kann ich dann den Thread mit interrupt() nicht mehr stoppen, da this.in.read() die while-Schleife blockiert, bis Daten eintreffen. Auch das Setzen des Timeout des Sockets hat nichts gebracht, da die Verbindung ja noch besteht, es halt aber nur keine Daten übermittelt werden.
Hattet Ihr schon mal ein ähnliches Problem? Lösung?
Zur Erklärung: this.in ist der InputStream des Client-Sockets
Code:
private String readCommand(final boolean interruptible) {
int data;
StringBuffer sb = null;
try {
while (!(this.isInterrupted() && interruptible)) {
if (this.in.available() > 0) {
data = this.in.read();
if (data == '|') {
break;
} else if (data != -1) {
if (sb == null) {
sb = new StringBuffer();
}
sb.append((char) data);
}
}
}
} catch (IOException ioe) {
this.println(ioe.getLocalizedMessage());
return null;
}
// Ist der Empfang unterbrochen worden?
if (this.isInterrupted()) {
return null;
}
// Daten zurueckgeben.
if (sb == null) {
return "";
}
return sb.toString();
}
Und zwar steht die Oberfläche ca. alle 10 Sekunden für 2 Sekunden. Wenn ich die Klammer mit this.in.available() entferne, tritt der Effekt nicht auf. Allerdings kann ich dann den Thread mit interrupt() nicht mehr stoppen, da this.in.read() die while-Schleife blockiert, bis Daten eintreffen. Auch das Setzen des Timeout des Sockets hat nichts gebracht, da die Verbindung ja noch besteht, es halt aber nur keine Daten übermittelt werden.
Hattet Ihr schon mal ein ähnliches Problem? Lösung?