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
 

anouqrat

Mitglied
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:
S

SlaterB

Gast
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?
 

anouqrat

Mitglied
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
 
S

SlaterB

Gast
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
 

anouqrat

Mitglied
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
 
S

SlaterB

Gast
> 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
 

anouqrat

Mitglied
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
 
S

SlaterB

Gast
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..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
B Multi-Threaded block bei BufferedReader.readLine() Netzwerkprogrammierung 8
O BufferedReader.readline kommt nicht zurück Netzwerkprogrammierung 7
B BufferedReader.readLine() ließt nicht vollständig ! ? Netzwerkprogrammierung 5
M HTTP URLConnection + BufferedReader killt meine Umlaute Netzwerkprogrammierung 4
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
C Socket BufferedReader.read(char[] buffer) blockiert unregelmäßig Netzwerkprogrammierung 3
J BufferedReader.ready() wird nicht true Netzwerkprogrammierung 10
V Socket BufferedReader interrupten? Netzwerkprogrammierung 10
S BufferedReader blockiert zu lange Netzwerkprogrammierung 4
P eine BufferedReader für alles ankommende Netzwerkprogrammierung 2
C 2 BufferedReader als Listener pro Socket (NICHT) möglich? Netzwerkprogrammierung 2
E BufferedReader.ready() immer false Netzwerkprogrammierung 8
R Mittels BufferedReader Objekte lesen? Netzwerkprogrammierung 5
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
C Kollision von ObjectInputStream und BufferedReader ? Netzwerkprogrammierung 6
F BufferedReader Socket Netzwerkprogrammierung 2
J Vom BufferedReader lesen -> hängt ohne Fehler,ohne Except Netzwerkprogrammierung 2
D Komischer Fehler Readline() Netzwerkprogrammierung 7
T Bezeichner "end of line" für die Funktion readline Netzwerkprogrammierung 5
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
0din SMTP Client - readline problem Netzwerkprogrammierung 4
G .readLine() blockt? Netzwerkprogrammierung 3
B Socket - Scanner - readLine(); Netzwerkprogrammierung 2
M Socket und readLine() Netzwerkprogrammierung 4
J readline blockiert? Netzwerkprogrammierung 9
P Problem mit readLine ---- und mit dem connecten Netzwerkprogrammierung 10
E Sockets, readLine() Netzwerkprogrammierung 7
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
Z Socket UDP Unicast blockiert wenn Ziel offline Netzwerkprogrammierung 1
F Socket new Socket() blockiert Netzwerkprogrammierung 3
G Socket.getInputStream().available() blockiert Oberfläche! Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben