# readline blockiert?



## jupa (16. Jan 2008)

Hallo,

ich habe folgendes Problem bei meinem Socket Server.

Ich möchte über den BufferedReader den InputStream des Clienten auslesen.

Dies mache ich in einer While Schleiffe, da die Methode readLine laut API nur eine Zeile ausliesst.

Beim ersten Durchlauf funktioniert das ganze auch, nur beim zweiten Durchlauf bleibt mein Programm in der While Bedingung hängen.

Kann mir einer da vielleicht einen Tipp geben?????

Hier mein Code...

BufferedReader serverIn = new BufferedReader(new InputStreamReader(client.getInputStream()));              

String lNextData;
String lClientData;			

while(( lNextData = serverIn.readline() ) != null ){

    lClientData = lClientData + lNextData;


}

Vielen Dank schonmal im voraus...


----------



## SlaterB (16. Jan 2008)

readline blockiert, ja, was ist nun die Frage?
kannst das ganze in einem separaten Thread ablaufen lassen,
dann könnte das Hauptprogramm noch weiterarbeiten,
trivial ist das alles aber nicht


----------



## jupa (16. Jan 2008)

Meine Frage ist , das ich eigentlich den BufferedReader komplett auslesen will, und auch sicher sein das ich alle daten gelesen habe.

Eigentlich wollte ich mit readLine solange lesen bis das er null zurückgibt, also keine weiteren daten vorhanden.

Das scheint aber nicht zu gehen...

Weil er beim 2 Aufruf von readline blockiert...


----------



## lhein (16. Jan 2008)

Das ist nunmal das Verhalten von Blocking Socket Connections.

Wenn Du dieses Verhalten nicht willst, wirst Du um java.nio nicht herum kommen, um non-blocking zu fahren.
Dazu würde ich Dir aber eine Bibliothek wie z.B. xSocket ans Herz legen. Die nimmt Dir die meiste Arbeit ab.

lr


----------



## tuxedo (16. Jan 2008)

Wenn der Client alles gesendet hat, dann lass ihn doch den Stream/Socket schließen.. Dann blockiert der Server auch nicht mehr.

Wenn aber "immer mal wieder" Daten ankommen, dann solltest du das ganze wirklich in einen Thread auslagern. NIO ist bei "kleinen" Systemen mit wenigen Clients die nicht ständig was senden, IMHO etwas "übertrieben". 

- Alex


----------



## jupa (16. Jan 2008)

Hallo alex0801,

leider darf ich den Clienten noch nicht schliessen weil ich erst seine Meldung verarbeiten muss und ihm dann eine Antwort senden will.

Ist denn sichergestellt das readLine() den ganzen Text aussliesst welcher gesendet wurde, oder wirklich nur eine Linie.


----------



## tuxedo (16. Jan 2008)

Schau mal in die API-Doc ... readLine() ließt exakt soviel Text bis ein Zeilenumbruch erfolgt.
Du könntest nach dem Senden der Meldung auch ein "Meldung-Ende<cr><lf>" senden. Also eine "bin fertig" zeile. Dann kannst du im Server sagen, wenn die "bin fertig" Zeile gelesen wurde, höre auch mit Zeilen lesen und bearbeite seine Meldung/Anfrage.

Wie sieht so eine Meldung aus? Besteht die immer aus einer Zeile oder sind es mehrere Zeilen? Ist es eine fixe Anzahl an Zeilen oder ist das variabel?

Wieso benutzt du kein RMI?

- Alex


----------



## SlaterB (16. Jan 2008)

>  Also eine "bin fertig" zeile.

tja, aber wann soll der Empfänger das nächste mal schauen, ob wieder was da ist? 
irgendwann wirds blockieren,

vielleicht hilft



> public boolean ready()
> throws IOException
> 
> Tells whether this stream is ready to be read. A buffered character stream is ready if the buffer is not empty, or if the underlying character stream is ready.
> ...


----------



## tuxedo (16. Jan 2008)

> tja, aber wann soll der Empfänger das nächste mal schauen, ob wieder was da ist? 

Da er ja offensichtlich nicht asynchron arbeitet, würde ich sagen wenn die Antwort zum Client bearbeitet und versandt wurde, dann sollte er wieder auf die nächste Meldung warten und blockieren. 
Ist eine Frage des "Protokolls". 

Da mir das ganze nach einem Frage-Antwort-Ding aussieht, würde ich glaub zu RMI greifen. Da ist das ja super-schnell fertig gebastelt und man muss sich keinen Kopf drum machen die richtige Reihenfolge zu behalten etc...

- Alex


----------



## jupa (16. Jan 2008)

ich versuch es mal damit...

danke


----------

