Mehrzeiligen Text von Socket einlesen?

Hallo,

ich möchte mit Java einen kleinen Mailclient programmieren und hänge nun an folgendem Problem fest:

Immer wenn ich ein Kommando, z.B. STAT oder USER zum POP-Server geschickt habe, kam auch nur eine einzeilige Antwort zurück à la +OK 2 2345. Die habe ich wunderbar mit unten stehendem Code einlesen können. popSocket ist meine Socket-Instanz, die auf den POP-Server zugreift.

Nun sende ich aber das RETR bzw. LIST Kommando und werde, zumindest bei RETR, nicht eine einzelne Zeile, sondern mehrere zurückbekommen. Leider habe ich keinerlei Idee, wie ich die alle einlesen soll. Könnt Ihr mir da weiterhelfen?

in = new BufferedReader(new InputStreamReader(popSocket.getInputStream()));
received = in.readLine();
System.out.println(received);

Vielen Dank, Robert

Hallo Robert,

du muß eine Schleife schreiben die bei einem null Satz abbricht.

String zeile;
StringBuffer daten = new StringBuffer();
while ((zeile = in.readLine()) != null)
{ daten.append(zeile + „\n“);
}
recieved = daten.toString();

damit sollte es gehen. Es gibt übriges ein POP3 IMP4 Paket von Java das man von Javasoft herunterladen kann.

Den StringBuffer sollte man aus performance Gründen verwenden.

gruß

Thomas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Thomas,

erstmal vielen Dank für Deine Hilfe.

> while ((zeile = in.readLine()) != null){
> daten.append(zeile + „\n“); }

Die Schleife funktioniert generell schon, aber noch nicht hundertprozentig :smile:

Ich lasse mir im Schleifenrumpf einfach immer bei jedem Durchlauf den Inhalt von „zeile“ ausgeben. Der sieht auch gut aus. Allerdings sieht’s nach einer Endlosschleife aus. Die letzte Zeile wird korrekt empfangen, aber danach wird nicht abgebrochen, d.h. der auf die Schleife folgende Code wird nicht abgearbeitet.

Hast Du noch eine Idee?

Viele Grüße, Robert

Hallo Robert,

sendest du die Daten mit println ab? Schliesst du die sendende Socket? Damit hat es bei mir immer funktioniert.

Viele Grüße Thomas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

> while ((zeile = in.readLine()) != null){
> daten.append(zeile + „\n“); }

Die
letzte Zeile wird korrekt empfangen, aber danach wird nicht
abgebrochen, d.h. der auf die Schleife folgende Code wird
nicht abgearbeitet.

Das liegt daran, dass die Socket-Verbindung zum Mail-Server ja nicht abgebrochen wird, sondern weitere Anfragen folgen können. POP3 und IMAP sind ja verbindungsorientierte, authentifizierte Protokolle. Der Socket wird also nicht nach jedem Befehl geschlossen:
-> SOCKET OPEN
-> CONNECT
LOGIN!

Hallo Stefan,

Damit, auf das Schließen des Sockets zu warten, wirst du hier
nicht weiterkommen.

Nee, das ist wohl wahr :smile: Habe es inzwischen so gelöst, wie Du gerade vorgeschlagen hast. Das POP3-Protokoll sendet nach mehrzeiligen Antworten eine Zeile, die nur einen Punkt enthält. Ich frage nun ab, ob die Zeile einen . enthält und die Länge 1 hat. Dann ist sicher, dass alles übertragen wurde.

Vielen Dank, Robert