BufferedReader.ready() immer false

Status
Nicht offen für weitere Antworten.

Einwegdose

Aktives Mitglied
Hallo mal wieder :lol:

Ich hatte bisher bei der Connection zum Server immer einen Input-Stream verwendet, und den über eine Methode bei Bedarf ausgelesen. Nun wollte ich das alles in einen BufferedReader packen um es effizienter zu machen.
Leider aber liest er nichts ein und gibt immer direkt ein "false" bei der ready()-Methode zurück.


Alte Codierung:

Code:
   try {
    soc = new Socket(server, port);
    in = soc.getInputStream();
   } catch(Exception e) {}
...
...
// Aufruf der receive()-Methode
...
...
  public String receive() {
   int c = 0;
   text = "";
   try {
    while ( c != 10 ) {         // Eine Zeile einlesen
     c = in.read();
     text = text + ((char)c);
    }
   } catch(Exception e) {}
   return text;
  }

Dieser Code hat soweit auch funktioniert.
Hier der neue Ansatz:

Code:
   try {
    soc = new Socket(server, port);
    br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
   } catch(Exception e) {}
...
...
// Aufruf der receive()-Methode
...
...
  public String receive() {
   int c = 0;
   text = "";
   try {
    while ( br.ready() ) {        
     c = br.read();
     text = text + ((char)c);
    }
   } catch(Exception e) {}
   return text;
  }

Hier allerdings ist der Rückgabewert der br.ready() direkt false.
Weiss einer wieso ??

Im Endeffekt geht es darum, einen langen Text einzulesen, und dies sollte ja mit dem BufferedReader einiges effezienter sein als direkt mit dem InputStream !
 

meez

Top Contributor
So wird das gemacht:

Code:
public String receive() {
  text = ""
   try {
    String s;
    while ( (s = br.readLine()) !=null) {       
     text = text + s;
    }
   } catch(Exception e) {}
   return text;
  }

Anstatt text so zusammen zu setzen, solltest du einen StringBuffer nehmen; ist ja aber hier nicht das Subjekt.
Du hättest bei deinem "alten" Code auch einfach den InputStream in einen BufferedInputStream "einpacken" können.
 

Einwegdose

Aktives Mitglied
Danke schonmal für die Antwort. Leider scheint es aber so auch nicht zu klappen.

Ich habe dazu mal ein kleines Test-Programm geschrieben:


Code:
import java.net.*;
import java.io.*;

public class ServerTest {

 String text="",s;

  public void test() {
   try {
    Socket soc = new Socket("ftp.microsoft.com", 21);
    BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
    while ( (s = br.readLine()) !=null) {
     text = text + s;
    }
   } catch(Exception e) {}
   System.out.println("Empfangen: " + text);
  }

  public static void main(String[] args) {
   ServerTest st = new ServerTest();
   st.test();
  }
}

Leider kommt das Programm garnicht zu der Sop-Zeile .. eine Ausgabe erscheint nie. Testen wir das ganze mit Telnet, kommt die Anzeige "220 Microsoft FTP Service" dabei heraus !
Das liegt wohl daran, dass er immer noch was liest, obwohl überhaupt nichts da ist. Selbst wenn ich "s" als int ausgebe, erscheint nichts .. er hängt in der while-Schleife ohne irgend etwas zu machen !?!
 

meez

Top Contributor
Ach du hast da ja Socket...Was erwartest du...
Da ist kein FTP Protokoll implemetiert...das musst du schon selber machen ;)

Socket OSI Layer 4 .... FTP OSI Layer 6 ... Du siehst also, da Fehlen noch zwei :D

Aber anstatt:
Code:
Socket soc = new Socket("ftp.microsoft.com", 21);
BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));

schreib mal:
Code:
URL soc = new URL("ftp://ftp.microsoft.com"); 
BufferedReader br = new BufferedReader(new InputStreamReader(soc.openStream()));


btw. Lass dir den Stack ausgeben: Im catch-Block e.printStackTrace(); einfuegen.
 

Einwegdose

Aktives Mitglied
Ok, ich glaube ich muss mich etwas präzisieren ;)

Kurz zu deiner Hilfestellung:
Jetzt kommt zwar was, allerdings kein "220 Microsoft FTP Service" sondern

Empfangen: dr-xr-xr-x 1 owner group 0 Feb 1 17:31 bussysdr-x
r-xr-x 1 owner group 0 Feb 1 19:02 deskappsdr-xr-xr-x 1 ow
ner group 0 Feb 1 19:16 developrdr-xr-xr-x 1 owner group
0 Feb 1 19:16 KBHelpdr-xr-xr-x 1 owner group 0
Feb 1 20:06 MISCdr-xr-xr-x 1 owner group 0 Feb 1 20:15 MIS
C1dr-xr-xr-x 1 owner group 0 Feb 1 20:18 peropsysdr-xr-xr-x
1 owner group 0 May 22 18:01 Productsdr-xr-xr-x 1 owner
group 0 Feb 1 20:24 PSSdr-xr-xr-x 1 owner group
0 Feb 1 20:25 ResKitdr-xr-xr-x 1 owner group 0 Feb 1 20:4
4 Servicesdr-xr-xr-x 1 owner group 0 Feb 1 22:31 Softlib


Aaaaaaaaalso, es geht atm darum zu einem POP-Server zu connecten.
Das ganze hat mit der "alten" receive() (und dem InputStream und dem "reinen" Socket) auch soweit geklappt, die Abfrage nach c==10 (Line Feed) war so, weil die Methode nur für einzeilige Antworten gedacht war und weil nie ein "-1" (InputStream leer) auftrat. Nun wollte ich es eben auf einen BufferedReader umstellen und stehe vor der selben Problematik .. er hört nicht auf zu lesen ;) Da komm ich mit dem URL wohl auch nicht weiter :(
 

meez

Top Contributor
Nimm den readLine halt aus der while schlaufe raus...Einfach text = in.readLine() ... Liest einfach die erste Linie...
Das "Service" kommt nicht mehr, da du jetzt das Protokoll (URL) implemtiert hast, und dies jetzt vom Protokollhandler weggeschnitten wird...
Vorher hast du einfach einen Teil des FTP Protokolls gelesen...Wenn du aber das willst kannst du Socket nehmen...
Da kriegst du einfach das was der Server dir zuerst sendet...(220 servername FTP ready o.ä)
Da er aber nachher was von dir erwartet, wird der Stream nicht vom Server geschlossen, sondern du musst ihn schliessen (daher auch kein -1)
 

Einwegdose

Aktives Mitglied
OK für eine Zeile klappt das jetzt auch :###

Code:
  public String receive() {
   try {
    text = br.readLine();
   } catch(Exception e) {}
   System.out.println(text);
   return text;
  }


Jetzt aber die Problematik bei mehreren Zeilen :autsch:
Ich weiss nicht, ob 50 Zeilen, 100 Zeilen oder 33 Zeilen kommen. Leider funktioniert ja die Methode br.ready() nicht, da diese ja immer "false" zurückgibt (wieso eigentlich ?).

Ich hab bisher einen Versuch gemacht, allerdings funktioniert er nicht ???:L

Code:
     text = br.readLine();
     String oldtext="";
     do {
      oldtext = text;
      text = text + (char)10 + br.readLine();
     } while ( !oldtext.equals(text+(char)10) );


Es liegt wohl daran, dass er nie von Zeile 5 wegkommt, da br.readLine() nie fertig wird wenn es nichts mehr zu holen gibt .. nur wie kann ich das verhindern :?:
 

Murray

Top Contributor
Einwegdose hat gesagt.:
Leider funktioniert ja die Methode br.ready() nicht, da diese ja immer "false" zurückgibt (wieso eigentlich ?).
ready() liefert dann true, wenn man aus dem Stream mindestens ein Zeichen lesen kann, ohne dass die read-Methode blockiert (also wartet, bis wieder Daten zur Verfügung stehen).
Wenn ready() false liefert, dann kann man in diesem Moment keine Daten lesen; das bedeutet aber nicht, dass nicht irgendwann nochmal Daten kommen.

Wenn Du von einem Server so Daten lesen willst, dann musst Du entweder vorab wissen, wieviel Bytes oder auch Zeilen kommen werden, beim Lesen der Daten diese Information ermitteln (siehe den Content-Length-Heder in HTTP), oder aber einen Timeout verwenden (also wenn ready() eine gewisse Zeit lang immer false zurückgeliefert hat annehmen, dass keine Daten mehr kommen werdn).
 

meez

Top Contributor
Einwegdose hat gesagt.:
Ich weiss nicht, ob 50 Zeilen, 100 Zeilen oder 33 Zeilen kommen. Leider funktioniert ja die Methode br.ready() nicht, da diese ja immer "false"

Wie schonmal gesegt, wird, wenn du auf einen FTP Server connectest, nie mehr als eine Zeile kommen.

Einwegdose hat gesagt.:
Es liegt wohl daran, dass er nie von Zeile 5 wegkommt, da br.readLine() nie fertig wird wenn es nichts mehr zu holen gibt .. nur wie kann ich das verhindern :?:

Schliessen des Streams...das würde aber bedeuten, dass dein Program an mindestens einer Stelle weiterlaufen müsste Threads...
Du könntest natürlich auch ein wenig faken...Schick dem Server halt einen FTP quit Befehl...(SocketOutputStream)


Oder, geh halt auf einen HTTP Server, bis du genau weisst, wie man mit Protokollen umgehen muss (Erleichtert für den Anfang einiges)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J BufferedReader.ready() wird nicht true Netzwerkprogrammierung 10
M HTTP URLConnection + BufferedReader killt meine Umlaute Netzwerkprogrammierung 4
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
C Socket BufferedReader.read(char[] buffer) blockiert unregelmäßig Netzwerkprogrammierung 3
A Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ... Netzwerkprogrammierung 9
V Socket BufferedReader interrupten? Netzwerkprogrammierung 10
B Multi-Threaded block bei BufferedReader.readLine() Netzwerkprogrammierung 8
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
R Mittels BufferedReader Objekte lesen? Netzwerkprogrammierung 5
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
C Kollision von ObjectInputStream und BufferedReader ? Netzwerkprogrammierung 6
O BufferedReader.readline kommt nicht zurück Netzwerkprogrammierung 7
F BufferedReader Socket Netzwerkprogrammierung 2
B BufferedReader.readLine() ließt nicht vollständig ! ? Netzwerkprogrammierung 5
J Vom BufferedReader lesen -> hängt ohne Fehler,ohne Except Netzwerkprogrammierung 2
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
J in.ready() liefert IMMER false zurück Netzwerkprogrammierung 11
S BufferedStream funktioniert nicht immer Netzwerkprogrammierung 7
Dann07 Audio streamen bricht immer ab nach kurzer Zeit Netzwerkprogrammierung 6
C Quelltext Webseite schlägt noch immer fehl Netzwerkprogrammierung 30
A Bestimmter URL/Certificate per Java immer vertrauen (Trustmanager/HostnameVerifier) Netzwerkprogrammierung 1
P Socket Server übertragung wird immer langsamer Netzwerkprogrammierung 4
S UDP Broadcast - Pakete kommen nicht immer an Netzwerkprogrammierung 15
nrg HTTP URLConnection immer neu öffnen? Netzwerkprogrammierung 6
G Server schickt immer null-Wert Netzwerkprogrammierung 5
M Dateidownload per FTP wird immer langsamer und bleibt dann stehen Netzwerkprogrammierung 3
1 Socket Immer offener Port? Netzwerkprogrammierung 11
N Socket Verbindung wird immer verweigert Netzwerkprogrammierung 5
T Tomcat zeigt immer nur eine Seite Netzwerkprogrammierung 3
T Socket immer Verbunden halten Netzwerkprogrammierung 11
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
C Dateiübertragung - Datei immer ein 4096faches von n Netzwerkprogrammierung 2
V Socket#getInputStream() immer der gleiche oder nicht? Netzwerkprogrammierung 4
M Socketverbindung funzt nich immer Netzwerkprogrammierung 3
N Socketkommunikation: Immer nur abwechselnd? Netzwerkprogrammierung 2
S ich bekomme immer java.rmi.UnmarshalException Netzwerkprogrammierung 10
G immer wieder gleiche Sockets Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben