BufferedReader.ready() wird nicht true

jiuka

Mitglied
Hallo,
kann mir jemand mit folgendem Problem helfen?:
Java:
        server = new Socket(servername, 587);
        
      
        DataInputStream in = new DataInputStream(server.getInputStream());
        DataOutputStream out = new DataOutputStream(server.getOutputStream());
        BufferedReader smtpIn = new BufferedReader( new InputStreamReader(server.getInputStream()));

        if (server != null) {
	        text= "EHLO " + InetAddress.getLocalHost().getHostAddress() + "\n";
	    	out.write(text.getBytes());
	        out.flush();
   
	        System.out.println("ready: " + smtpIn.ready());
	        while ( smtpIn.ready() ){
	        	System.out.println(smtpIn.readLine());
	        }
...warum wird der smtpIn.ready() nicht true? es sind eindeutig zeichen drin. die kann ich auch auslesen.
danke vorab
christian
 

HoaX

Top Contributor
a) Woher weißt du dass was drin ist? Aus dem von dir gezeigen Codestück lässt sich das jedenfalls nicht ableiten.
b) DataInputStream und InputStreamReader parallel auf dem Socket sind böse!
 

jiuka

Mitglied
hallo,
um den datainputstream geht es garnicht. das war nur ein versuch um zu schauen wie groß die available bytes sind.. ich weiß das da was drin ist weil ich daraus auch etwas auslesen kann. soll ich dir den consolenoutput schicken? ;-)
lg christian
 

HoaX

Top Contributor
Was du da treibst ist sinnfrei:

Wenn du zuerst einen DataInputStream erzeugt, kann es sein dass dieser schon ohne sonstiges zutun schon Daten liest, ich weiß grad nicht genau wie das interne Protokoll aussieht.
Der BufferedReader wird diese Daten niemals sehen, da sie schon gelesen sind. Der BufferedReader selbst puffert die Daten auch, wie der Name vermuten lässt. Was dieser also schon eingelesen hat - du aber noch nicht abgerufen hast - wird auch nie im DataInputStream auftauchen.
Soviel zu dem parallel Streamzugriff, sovas macht man nicht, man nutzt immer nur einen, dann kann man sicher sein dass auch nur an dieser Stelle die Daten ankommen und nicht die Hälfte hier und die andere Hälfte woanders.

Wenn du Daten an den Server schickst, dann müssen diese ja erstmal übertragen werden, und die Antwort des Servers auch, wenn er die Anfrage denn mal irgendwann verarbeitet. Wenn du also direkt nach deinem flush() mit ready() schaust ob was da ist, dann kommt da natürlich mit hoher Wahrscheinlichkeit false zurück, so schnell ist nirgendwo das Internet.
Lass doch einfach mal die while-Schleife mit dem ready() weg. Lies lieber die Javadoc zu BufferedReader#readLine(), dann wüsstest du, dass die Methode von sich aus schon wartet bis eine komplette Zeile angekommen ist. Das macht nämlich deine ready()-Schleife überflüssig.

Btw: Bei der gezeigen Konstellation kann server nicht null sein ...
 
Zuletzt bearbeitet:

jiuka

Mitglied
Hallo,
Danke! Du bist ein Schatz. Nach all deinen bösen Anschuldigungen war das was ich übersehen habe dabei. Ich mache das natürlich auch nicht parallel! Aber der Hinweis mit der Zeit war sehr hilfreich. Im übrigen ist die Schleife sehr sinnvoll wenn man mehr als eine Zeile an Antworten erwartet. Vielen Dank auch für den Hinweis mit Server. Ich habe da nur ins blaue geraten und ging davon aus, wenn die Adresse-Port Kombination nicht stimmt, stünde da noch null drin... vielen vielen Dank
Christian
 

HoaX

Top Contributor
Nein, auch bei mehreren Zeilen ist sie nicht sinnvoll. Wieso sollte es? Wenn du 5 Zeilen erwartest, wer sagt, dass die alle auf einmal kommen und nicht erst zwei und dann zehn Sekunden später nochmal drei? In diesen zehn Sekunden wird ready() auch false liefern -> bringt nix.

Btw: Smtp brauchst du nicht selbst implementieren, gibts mit JavaMail schon fertig.
 

jiuka

Mitglied
Du gehörst wohl auch zu den Leuten, die immer das letzte Wort haben müssen? ^^
Also der Server gibt am Stück aber in unbekannter Menge die Nachrichten zurück. Z.B. Antwortet der mit allem, was er beherrscht. So kann es sein, dass einer die Verschlüsselung beherrscht. Ein anderer aber nicht. D.h. die Anzahl der Nachrichten kann sich schon mal mindestens um eins unterscheiden. Deshalb die Schleife.
lg Christian
 

jiuka

Mitglied
Darf ich dich zitieren? Das Internet ist nicht so schnell. Das würde das gleiche Problem mit sich bringen. Wenn man ohne Zeitpuffer den Buffer anspricht ist der natürlich auch wieder leer.
lg Christian
 

HoaX

Top Contributor
Eben nicht. readLine() wartet bis die nächste vollständige Zeile empfangen wurde oder der Stream geschlossen wird. Also entweder man liest mit readLine() bis null zurück kommt, dann wurde der Stream geschlossen, oder man wertet die empfangenen Daten aus und weiß wann man nichtmehr lesen muss, bzw. man weiß vorher wieviele Zeilen kommen.

Selbst wenn der Server mehrere Zeilen "auf einmal" sendet, wie immer man das deuten mag, so heißt das nicht dass diese auch zusammen ankommen. Bedingt durch z.B. MTU kann ein gesendetes großes Paket auch als fünf kleine ankommen. Wie du mich richtig zitierst: Das Internet ist nicht so schnell, hat verschiedene Routen etc, deine Schleife mit ready() bricht mit hoher Wahrscheinlichkeit bereits zu einem Zeitpunkt ab, an dem du das nicht willst.

PS: Ich muss nicht das letzte Wort haben, mir liegt nur daran dich auf deine (gedanklichen) Fehler hinzuweisen. Ich bin mir durchaus bewusst, dass ich dem Fragenden selten Honig um den Mund schmiere, aber irgendwann gibt man halt auf und konzentriert sich aufs wesentliche, die Fehler. Ich mein es wirklich nicht böse wenn ich manche Dinge manchmal etwas barsch formuliere. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E BufferedReader.ready() immer false Netzwerkprogrammierung 8
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
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
OnDemand JMS Messages wird gecached Netzwerkprogrammierung 2
P RMI stub wird nicht gefunden Netzwerkprogrammierung 8
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
M com.google.gson wird nicht erkannt Netzwerkprogrammierung 2
F Website parsen, die mit javascript zusammengebaut wird Netzwerkprogrammierung 1
P Socket Server übertragung wird immer langsamer Netzwerkprogrammierung 4
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
L Server anpingen (Pingzeit) ?? Pingzeit wird nicht verändert Netzwerkprogrammierung 6
M JSP wird im gesamten Projekt nicht neugeladen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
R Socket SSL-Connect in Servlet - keystore wird nicht gefunden Netzwerkprogrammierung 2
S anderer Rechner wird nicht gefunden Netzwerkprogrammierung 20
X Änderung des Objekts wird nicht serialisiert Netzwerkprogrammierung 9
M Socket TCP keep alive Exception wird nicht ausgelöst Netzwerkprogrammierung 11
F getSource Methode wird als Bot erkannt Netzwerkprogrammierung 8
Dit_ RMI setSoTimeout wird ignoriert? Netzwerkprogrammierung 3
lumo String[] wird zu null bei Serialisierung Netzwerkprogrammierung 8
J method = PUT, aber ausgeführt wird doGet...? Netzwerkprogrammierung 4
K Was wird genau per Telnet verschickt ? Netzwerkprogrammierung 5
M Dateidownload per FTP wird immer langsamer und bleibt dann stehen Netzwerkprogrammierung 3
C RMI Klasse wird unter falschem Pfad gesucht Netzwerkprogrammierung 4
B Server-Programm wird durch "read" beendet Netzwerkprogrammierung 8
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
N Socket Verbindung wird immer verweigert Netzwerkprogrammierung 5
K HTTP-Anfrage an einen Server wird nicht beantwortet Netzwerkprogrammierung 3
M URL Handler wird nicht gefunden Netzwerkprogrammierung 6
L SSL Verbindung aber Server wird erst im Programm festgelegt Netzwerkprogrammierung 4
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
C Download-Fortschritt wird falsch angezeigt. Netzwerkprogrammierung 2
A Quellcode von Homepage wird nicht komplett eingelesen Netzwerkprogrammierung 5
V RMI: code wird einfach übergangen ? Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
F Stream wird als Char übertragen. Char -> in String umwand Netzwerkprogrammierung 5
L RMI-Funktion wird lokal ausgeführt Netzwerkprogrammierung 12
A RMI: Wo wird die Methode ausgeführt? Netzwerkprogrammierung 9
P JNDI LDAP-SSL Verbindung, Zertifikat wird nicht angezeigt ? Netzwerkprogrammierung 2
A JavaMail Problem - Nachricht wird nicht versendet ? Netzwerkprogrammierung 9
T finlalize Methode vom Server wird nicht aufgerufen Netzwerkprogrammierung 4
B Socket wird nicht richtig geschlossen Netzwerkprogrammierung 2
K mapSystemException wird geworfen Netzwerkprogrammierung 2
L Attachment wird nicht angezeigt in der Email Netzwerkprogrammierung 3
P RMI - meine Stub-Class wird nicht gefunden Netzwerkprogrammierung 9
G Socket wird nach Portscann geschlossen Netzwerkprogrammierung 2
R Socket wird nicht ausgeführt Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben