Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ...

anouqrat

Mitglied
Hallo,
ich habe folgendes Problem:
Java:
BufferedReader buffReader = new BufferedReader(new InputStreamReader(fSocket.getInputStream()));

Ich schicke über den Socket OutputStream einen Request, worauf der Server mir eine Antwort, die aus mehreren Zeilen besteht.
Das Ende der Response wird durch den String "END" gekennzeichnet.
Zum Einlesen verwende ich den oben erstellten BufferedReader:
Java:
String s = null;
while ((s = buffReader.readLine()) != null) {
			
  if (s.equals("END"))
    break;

  // schreibe den empfangenen String in eine bereits erstellte Datei
  // über die FileOutputStream Instanz.
  fileOutputStr.write(s.getBytes());

}

Das Problem besteht darin, dass die readLine() Methode MANCHMAL nicht zurückkehrt.
Erst, wenn ich einen neuen Request sende, kehrt die readLine() Methode zurück und es wird mit den anderen Zeilen fortgesetzt.

Hat jemand eine Erklärung dafür bzw. einen Hinweis, wie ich das Problem beheben kann ?

Es Ist dringend.
Vielen Dank im Voraus.
anouqrat
 
Schickst du am Ende jeden Befehls auch einen Zeilenumbruch? Sonst ist ja keine "line" zum "readen" da

Erstmal dank für die schnelle Antwort.
Ja. Die Zeilen, die mir der Server als Antwort schickt, enthalten alle einen Zeilenumbruch.
Darum habe ich mich entschieden einen BufferedReader, damit ich readLine verwenden kann.

Das Problem besteht darin, dass die readLine() Methode nur sproadisch blockiert. Das Problem kann nicht immer reproduziert werden. Darum kann ich nicht erklären, warum es in der meisten Zeit funktioniert und ab und zu mal nicht funktioniert.

Besten Dank,
anouqrat
 
Zuletzt bearbeitet:
vielleicht hast du auf Gegenseite kein flush() zum Senden,
dann kann sich das Programm selber aussuchen wann es mal was sendet

also der Empfänger kann nicht anders programmiert werden, wie sieht der Sender aus?
 
Das stimmt. Beim Senden sende ich kein flush().
Könnte wirklich sein, das wäre der Grund, für dieses Problem, was sporadisch auftritt ?

Würde das denn heißen, dass ich nach jedem Senden ein flush() aufrufen muß ?

Besten Dank,
anouqrat
 
ob es der Grund ist weiß ich persönlich nicht, ich vermute,
und nötig mag es nur bei bestimmten Writern sein, z.B. BufferedWriter, der implementationsgemäß seine Daten zunächst zurückhält
 
Ich habe mal einen flush() eingefügt, so dass es nach jedem Senden aufgerufen wird ==> Das Problem kann immer noch produziert werden.
Vielleicht zum Verständnis:
Beispiel eines Aufrufs, den ich an den Server schicke, und die Struktur der Antwort:

--> DOWNLOADMSG <msID>
<-- DOWNLOADMSG_RESP_PART_1\n
BEGIN\n
zeile 1\n
zeile 2\n
...
zeile n\n
END\n
DOWNLOADMSG_RESP_PART_2\n
BEGIN\n
zeile 1\n
zeile 2\n
...
zeile n\n
END\n

Und so weiter, bis alle Packete (DOWNLOADMSG_RESP_PART)empfangen werden.

Das heisst, dass ich für einen Request hunderte Zeilen empfange, die ich dann abarbeiten muss.
Also ein flush() nach dem "DOWNLOADMSG" zu schicken hat nicht geholfen.

Besten Dank,
anouqrat
 
> Also ein flush() nach dem "DOWNLOADMSG" zu schicken hat nicht geholfen.

klingt komisch, flush() an einer bestimmten frühen Stelle, hier vielleicht gar vor dem so unbedingt wichtigen \n, bringt wenig

der Sender sendet alles was er zu senden hat, ob 1, 10, oder 100 Zeilen,
und dann wenn er die nächsten 10 sec nix machen wird, dann muss flush() hin damit alles was gesendet werden soll und vielleicht noch gar nicht oder erst zum Teil wirklich abgeschickt werden soll, auch wirklich losgeschicht wird,

Quellcode des Senders wäre immer noch hilfreich
 
Ich kann leider den Quellcode des Senders nicht besorgen. Es handelt sich um einen in C/C++ geschriebenes Server.
Aber ich kann mal nachfragen, ob wirklich dabei eine entsprechende flush() Methode gibt, und ob sie auch aufgerufen wird.

Ich melde mich dann.

Beste Grüße,
anouqrat
 
was bedeutet dann der Satz
> Ich habe mal einen flush() eingefügt
?
hast du bei dir beim Client etwas geändert? ich sprach ja die ganze Zeit vom Server,

wenn man nicht weiß was der sendet wirds natürlich schwieriger, lokal Netzwerk mithören ist eine extreme Kontrollmöglichkeit,
aber könnte auch nicht sagen wie,

du kannst einen in Java geschriebenen Server verwenden, der paar Dummy-Daten senden, wenn die der Client empfängt aber andere nicht,
tja, was soll man dann machen

-----

da Sender ausfällt nochmal scharfen Blick auf Empfänger:
verwende testweise andere Reader als BufferedReader mit readline(), lies jedes Zeichen einzeln ein,
damit nur sporadisch auftretende Probleme zu erkennen wird allerdings nicht leicht..
 

Zurück
Oben