Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Unbekannte Anzahl an Zeilen auslesen + unerwartete Textzeile (https://www.delphipraxis.net/73719-unbekannte-anzahl-zeilen-auslesen-unerwartete-textzeile.html)

-lx- 22. Jul 2006 20:46


Unbekannte Anzahl an Zeilen auslesen + unerwartete Textzeile
 
Hallo.

Ich such mir die Finger wund. Immer wenn ich denke dass ich gleich ne Lösung gefundne habe werd ich wieder enttäuscht.

Also ich schreibe gerade ein kleines Mailprogramm das vorerst mit der Indy TCP Client Komponente arbeitet.

Wenn ich etwas an den Mailserver mit WriteLn schicke wird immer sofort vom Server etwas zurückgeschcikt. Somit kann ich gleich im Anshcluss die gesendete Zeile lesen.

Jedoch wenn ich dann mir die Liste an verfügbaren Mails anzeigen lassen will, zeigt e rimme rnur die erste zeiel an.

Wie also kann ich die Gesamtanzahl an Zeilen ermitteln oder kede Zeile empfangen ohne zu wissen wie viele gesendet werden?




Noch eine Frage: Wie kann ich denn mit "readln" reagieren, wenn eine unerwartete Textzeile gesendet worden ist bzw. vom Client empfangen werden soll? Man kann doch nicht immer mit readln auf der Lauer liegen und mit nem Timer als das Netz auslegen?





Mit freundlichen Grüßen

-lx- 23. Jul 2006 13:14

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Weis da niemand etwas dazu? Oo

Also mit ner Schleife würde es theoretisch gehen nur wenn nichts mehr gesendet wird dann wartet er und der Programmfluss wird angehalten.



mfg

Dax 23. Jul 2006 13:20

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Hilft dir die Funktion AllData weiter? Je nach Version sollte die im Client direkt oder im Socket-Handler sein.

Bernhard Geyer 23. Jul 2006 13:32

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Kurze Frage: Wieso nimmst Du nur die "reinen" TCP-Komponenten und nicht gleich die Mail-Komponenten von Indy oder ICS? Die Probleme du du jetzt selbst hast sind doch in diesen spezialisierten Komponenten schon gelößt.

-lx- 23. Jul 2006 14:16

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Dies wäre die Prozedur:
Delphi-Quellcode:
procedure PRead();
var temp: String ;
begin



      temp:= '' ;
      temp:= IdTCPClient1.ReadLn ;
      Memo1.Lines.Add(temp);



end;
Dies funktioniert. Jedoch sobald man Inhalte abruft die mehrere Zeilen überspannen, wird imme rnur die erste zeiel abgeholt. Wenn man den befehlö nochmals abschickt wird die nächste zeiel geholt usw.

Schon störrend. Das mit "AllData" funktioniert nicht so ganz. Der erwartet gleich am Anfangs cheinbar mehr Inhalt und bleibt stehen.

Warum nicht gleich mit der Pop3Komponente? Ja da ist mein Lehrer dran shculd. Der meinte man solle es doch erstmal so versuchen undd ann auf Pop3 umsteigen. Ich wollte es so halt erst versuchen da ich dneke so ist es vll. einfacher mit dem Verstehen als gleich schon ne neue Komponente verwenden.



mfg

Bernhard Geyer 23. Jul 2006 14:18

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Zitat:

Zitat von -lx-
Warum nicht gleich mit der Pop3Komponente? Ja da ist mein Lehrer dran shculd. Der meinte man solle es doch erstmal so versuchen undd ann auf Pop3 umsteigen.

Ok. Ist um des lernens willen.

-lx- 23. Jul 2006 15:00

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
also weis wer was ?

Der VAter meiner Freundinn meinte, dass sobald etzwas fertig gesendet wordne ist, ein "EOF" mitgesendet wird. Wie kann ich denn überprüfen ob sowas gesendet worden ist? Ich dneke dass e s"unsichtbar" also nicht in dem normalen String drinne steht.



mfg

-lx- 23. Jul 2006 23:47

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Hat da wirklich keiner eine Idee?

Oder ist die MAsse SOnntags nicht erreichbar!? ;)

Es müsste doch gehen... weil der Server schickt doch alles nach und nach... und es müsste eben sowas geben wie "Wenn etwas reinkommt, dann readln".


mfg

richie 24. Jul 2006 00:01

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Du musst wahrscheilich einen Timer nehmen. :wink: Hast du dir mal die Parameter von Readln angesehen? Einer davon ist ATimeout. Das heißt, wenn nach einer bestimmten Zeit nichts kommt, bricht er ab. Dann prüfst du nach jedem Empfangen, ob was da ist. Wenn nicht, müsste alles empfangen sein (ich weiß ja nicht, vielleicht fängt er von vorne an).

-lx- 24. Jul 2006 10:42

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Zitat:

function ReadLn(ATerminator: string; const ATimeout: Integer; AMaxLineLength: Integer): string; virtual;

Parameters

ATerminator: string = LF

End-of-line termination character or characters.

const ATimeout: Integer = IdTimeoutDefault

Time-out in milliseconds. Default value IdTimeoutInfinite.

AMaxLineLength: Integer = -1

Returns

String - Line read from the buffer.

Description

ReadLn is a function that returns a string containing a single line from the buffer maintained by TIdTCPConnection.

The optional ATerminator parameter indicates the end-of-line symbol for the particular protocol. If data is expected, and you do not need a custom end-of-line symbol, you can use the default ATerminator value (#0). ATerminator values include:

#0 - Default Line Feed (#10)
LF - Line Feed (#10)
CR - Carriage Return (#13)
EOL - End-of-line (Carriage Return + Line Feed)


If there is no terminator (ATerminator) in the buffer, ReadLn will read more bytes from the TCP stack through the ReadFromStack method.

Use a custom time-out (ATimeout) value to change the number of milliseconds to wait for a response from the peer connection before a time-out occurs. The default value for ATimeout is IdTimeoutInfinite. See IdGlobal.pas for more information on constant timeout values.

ReadLn will return an empty string ('') if the peer connection is prematurely closed or a time-out occurs. When a timeout condition occurs in ReadLn, the ReadLnTimedOut property is set to True.
Wenn ihr mir nun nochmal helfen könntet das zu entschlüsseln wäre dies sehr hilfreich.

Also dieses TimeOut Ding würde in Verbindung mit einem Timer gut funktionieren, da man ja eig. aus schleifen nicht einfach aussteigen sollte außer ich nehm ne repeat-until bzw. do-while schleife.
Wie geht das aber nun mit diesem EOL ? scheint eine etwas elegantere Methode zu sein.
Jedoch werd eich aus der Hilfe dazu (s.o.) nicht schlau. Es liegt vll. daran, dass ich Delphi direkt gelernt habe. D.h. es wurde kein Wert darauf gelegt, wie der Syntax zu stand ekommt und wieso usw... das mal am Rande.



Mit freundlichen Grüßen

-lx- 30. Jul 2006 23:50

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Mal eine Frage...

Mir ist nicht klar was folgende Attribute (?) vom ReadLn machen.

Zitat:

#0 - Default Line Feed (#10)
LF - Line Feed (#10)
CR - Carriage Return (#13)
EOL - End-of-line (Carriage Return + Line Feed)
Z.B. EOL: Wenn das Ende der gesendete Reihe eingetroffen ist, passiert was ?
Oder heißt es wenn das Ende des gesamten geendeten Textes der sich jedoch über mehrere Zeilen erstreckt am Ende ist, passiert was ??


Dies ist mir nicht klar.

Der Code sehe doch so aus oder? :

Delphi-Quellcode:
ReadLn('EOL', 2000)
Also bei "end of Line" passiert etwas und vosichthalber ist ein ein Timeout von 2000 eingebaut.


Es wäre echt klasse wenn ihr mi das mal erläutern könntet. Aus der englischen Beschreibung werde ich nicht schlau.



mfg

marabu 31. Jul 2006 07:46

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Guten Morgen.

Deine Bemühungen um einen low level Zugriff auf das MAIL Protokoll können nur erfolgreich sein, wenn du die Protokoll-Spezifikation studierst. Die maßgeblichen RFCs sind in der Indy-Dokumentation angegeben.

Zumindest ansatzweise musst du das schon gemacht haben, da du ansonsten die Verben nicht kennen würdest um mit dem Server zu kommunizieren. In der Spezifikation solltest du aber auch etwas zum message format finden. Der Server beendet mehrzeilige Nachrichten immer mit einer letzten Zeile, die nur einen Punkt enthält.

Nun kannst du entweder in einer Schleife mit ReadLn() solange lesen, bis das du diese letzte Zeile empfangen hast - oder du verwendest gleich die Methode Capture().

Der Aufruf von ReadLn() müsste mit den Standardargumenten funktionieren, der line terminator ist dann #10 (LF, line feed). Der Effekt ist, dass dir eine String zurückgeliefert wird, sobald dieses Zeichen im Eingabepuffer entdeckt wird. Auf diese Weise erhältst du jede Zeile einer mehrzeiligen Nachricht einzeln. Ich habe es nicht ausprobiert, aber eventuell erreichst du ein besseres Ergebnis mit ReadLn(EOL), weil dann kein CR an die zurückgelieferte Zeile angehängt wird. Auf keinen Fall kann ReadLn('EOL') funktionieren. Du solltest selbst erkennen warum nicht.

Grüße vom marabu

-lx- 31. Jul 2006 12:22

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Hallo und danke für deine Antwort! =)

Mit den RFC-Befehlen hab eich mich bereits befasst und über Telnet funktioniert es ja auch prima! :)

Nicht jede Nachricht die vom Server gesendet wird, endet mit einem Punkt
Wenn man sich die LIST ausgeben lässt dann endet diese mit einem Punkt. Aber USER oder PASS oder STAT endet mit keinem Punkt.
Wenn man dann eien Nachrcht öffnet endet diese auch mit einem Pukt am Ende. Jedoch der Text innerhalb auch. Daher wäre das mit dem Überprüfen eines Punktes etwas umständlich. Würde aber funktionieren. Ich werde es mal ausprobieren.

Jedoch scheint mir die Variante mit LF und EOL auf eien gewissere Art eleganter.


Wenn ich die ' ' entfernen, sagt er mir dass jene "undefenierte Bezeichner" sind. -> Edit: Ich muss diesen Zahlencode mit #-Zeichen angeben, oder? LF: #10 ; EOL: #13 + #10 Oder ?


ReadLn empfängt immer nur eien Zeile ohne "Return" aus dem gesmaten gesendeten Text, oder ?
Und Capture empfängt alles, so wie ich das verstandne habe !?


Edit: Also wenn ich 2mal ReadLn habe und beiden das Argument #13+#10 übergeben habe (EOL) und ich eien einzeiligen Zexz erhalte passiert was ? das erste ReadLn liest den Text und gibt ihn gegebenfals wo aus. Jedoch wenn das 2. ReadLn nun lesen will kommt jedoch nichst wartet das programm. Also was bringt dann dieses EOL ? Wie kann ich dies überprüfen? Wird dies am Ende jeder textgefüllten Zeile angehängt oder in jeder leeren Zeile ???



Ich weis dass das vile Fragen sidn aber ich weis nicht wo ich sonst nachschlagen könnte bzw. wo ich es danna uch verstehe. Und da bietet sich solch ein Forum am Besten an.


Mit freundlichen Grüßen

marabu 1. Aug 2006 17:19

Re: Unbekannte Anzahl an Zeilen auslesen + unerwartete Textz
 
Hallo.

Zitat:

Zitat von -lx-
Nicht jede Nachricht die vom Server gesendet wird, endet mit einem Punkt

Ich hatte das auch nur für mehrzeilige (variabel lange) Nachrichten behauptet. Vermutlich liefern die Befehle USER, PASS und STAT keine solchen Nachrichten.

Zitat:

Zitat von -lx-
Wenn man dann eien Nachrcht öffnet endet diese auch mit einem Pukt am Ende. Jedoch der Text innerhalb auch.

Hier kann ich dir nicht folgen.

Zitat:

Zitat von -lx-
Wenn ich die ' ' entfernen, sagt er mir dass jene "undefenierte Bezeichner" sind.

Die Konstanten sind in der Unit IdGlobal definiert - einfach mit USES einbinden.

Zitat:

Zitat von -lx-
ReadLn empfängt immer nur eien Zeile ohne "Return" aus dem gesmaten gesendeten Text, oder ?
Und Capture empfängt alles, so wie ich das verstandne habe !?

So verstehe ich die Beschreibung, aber durch Probieren verschaffst du dir letzte Klarheit.

Zitat:

Zitat von -lx-
Also wenn ich 2mal ReadLn habe und beiden das Argument #13+#10 übergeben habe (EOL) und ich eien einzeiligen Zexz erhalte passiert was ? das erste ReadLn liest den Text und gibt ihn gegebenfals wo aus. Jedoch wenn das 2. ReadLn nun lesen will kommt jedoch nichst wartet das programm.

Ich denke du weißt aufgrund des RFC ob du mit einer einzigen oder mehreren Zeilen als Antwort rechnen musst. Bei einzeiligen Antworten wirst du kein zweites ReadLn aufrufen und bei mehrzeiligen Antworten wirst du Capture verwenden.

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz