Socket BufferedReader.read(char[] buffer) blockiert unregelmäßig

christian667

Neues Mitglied
Howdy 🙂
Ich arbeite schon längere Zeit an einem eigenen XMPP client und nutze zum lesen des Sockets einen BufferedReader. Da ich zeichenweise einlesen möchte und das anfänglich auch gleich so parse, habe ich ein
Java:
 char[] buffer = char[1]
und lese mit der Funktion
Java:
 BufferedReader.read(buffer)
byteweise in meinen Bufferarray.
Konkret sieht das also ungefär so aus:
Java:
int test = 0;
char[] buffer = char[1];
test = reader.read(buffer);
Das merkwürdige ist, dass die Memberfkt. read(char[]) blockierend arbeiten soll, also sollte etwas in dem buffer stehen, liest sie das in das char[] und weiter geht's im Text.. Dabei steht der Rückgabewert danach auch in "test" als int interpretiert. Ist "test" nun == -1, sollte das das Stream Ende per Definition sein. Soweit alles klar, aber es passiert etwas ganz unvorhergesehenes: Nach vielen Stunden korrekter arbeitsweise, blockiert .read() nicht mehr korrekt, sondern löst sich und das mit test==-1, was ich mir nicht erklären kann!
Hat jemand eine Idee, was da vor sich geht?
lg
 
eine javaunabhängige Trennung der Netzwerkverbindung durch normalen Netzwerkfehler (verlorene Nachrichten) oder automatisch durch die Gegenseite, das Betriebssystem, Firewall, Provider oder wer sonst was zu sagen hat, kommt nicht in Frage?
 
Doch, es passiert immer dann, wenn ich den computer in den ruhezustand schicke und wieder aufwecke. Mein Client verbindet automatisch erneut, aber der BufferedReader löst die Blockade in diesem Moment für entweder 2 Mal oder ~ 40.000 mal.. unberechenbar. Ich habe das ganze in eine Schleife gepackt, die ließt, solange "test == -1" ;-)
Ist somit aber mehr oder weniger ein work-around.. ich verstehe halt nicht, warum das wiederverbinden der netzwerkschicht den bufferedReader vorgaukelt, es gäbe neue daten?!
lg
 
ich verstehe es noch nicht, was genau passiert 2x oder 40.000x? was sind die neuen Daten?
wenn -1 kommt dann sollte der Reader zu Ende sein und nicht mehr verwendet werden,
egal ob die Verbindung wiederhergestellt werden kann oder ähnliches, in dem Fall ist ein neuer Reader doch nicht zuviel verlangt?

wenn -1 gelesen wird, dann immer wieder -1, ohne zu blockieren, das ist einfach die 'ich bin tot'-Meldung,
ein Test a la == -1 ist ganz gewiss etwas richtiges, gehört fast zu jedem Reader,
danach sollte nie wieder gelesen werden

oder falls du schon selber irgendwie einbaust, dass verrückterweise später mal wieder was anderes als -1 kommt,
dann könntest du zumindest in diesem Fall eine 10 Sekunden-Wartepause einbauen, weil der Reader nicht blockiert sondern immer -1 zurückgibt (40.000x?)
 

Zurück
Oben