readline blockiert?

Status
Nicht offen für weitere Antworten.

jupa

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

SlaterB

Gast
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

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

Top Contributor
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
 
T

tuxedo

Gast
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

Aktives Mitglied
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.
 
T

tuxedo

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

SlaterB

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

Overrides:
ready in class Reader
Returns:
True if the next read() is guaranteed not to block for input, false otherwise. Note that returning false does not guarantee that the next read will block.
Throws:
IOException - If an I/O error occurs
 
T

tuxedo

Gast
> 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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ... Netzwerkprogrammierung 9
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
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
B Multi-Threaded block bei BufferedReader.readLine() Netzwerkprogrammierung 8
G .readLine() blockt? Netzwerkprogrammierung 3
B Socket - Scanner - readLine(); Netzwerkprogrammierung 2
M Socket und readLine() Netzwerkprogrammierung 4
P Problem mit readLine ---- und mit dem connecten Netzwerkprogrammierung 10
E Sockets, readLine() Netzwerkprogrammierung 7
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
O BufferedReader.readline kommt nicht zurück Netzwerkprogrammierung 7
B BufferedReader.readLine() ließt nicht vollständig ! ? Netzwerkprogrammierung 5
Z Socket UDP Unicast blockiert wenn Ziel offline Netzwerkprogrammierung 1
C Socket BufferedReader.read(char[] buffer) blockiert unregelmäßig Netzwerkprogrammierung 3
F Socket new Socket() blockiert Netzwerkprogrammierung 3
S BufferedReader blockiert zu lange Netzwerkprogrammierung 4
G Socket.getInputStream().available() blockiert Oberfläche! Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben