Autor Beitrag
GU_Meyer
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 1

Win 7
Delphi 5 Prof
BeitragVerfasst: Do 16.01.14 12:27 
Hallo,

als Teil einer umfangreichen Client-Server-Dateiverwaltung verwende ich eine Stringliste (ServerDateiStrL) die ich mit Hilfe eines Streams vom Server an den Client übertrage (in Grundzügen nach den hier gefundenen Tuturials von "Narses" zu den Themen "Terminatorzeichen-Protokoll 1 und 2).

Die Übertragung funktioniert auch grundsätzlich, das Problem taucht erst auf, wenn ich die aus dem Stream geladene Stringliste im Client weiterverarbeiten will.
Im Debugger enthält die Stringliste (Client) 49 Elemente, allerdings steht in ServerDateiStrL.Count (auch auf der Clientseite) der Wert 70.
Passiert bei dem "skizzierten" Weg (alle Variablen sind jeweils entspr. in Server bzw. Client deklariert und initialisiert) von

(Server:) ServerDateiStrL --> MessageStream (:TStringStream) --> TServerSocket.SendText(MessageStream.DataString) --> (Client:) ServerDateiStrL.LoadFromStream(MsgStream) (MsgStream : TStringStream)

irgendwas mit der Anzahl der Elemente in ServerDateiStrL?

Danke und Gruss

GU_Meyer
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Do 16.01.14 12:43 
Ein Link zu dem Tutorial wäre jetzt gut gewesen ;-)

Allgemeine gearentiert dir der Socket nur, dass die gleichen Daten ankommen, und in der richtigen Reihenfolge. Aber nicht, dass am anderen Ende nur genau ein Event ausgelöst wird!

Ein TServerSocket.SendText("Hallo") könnte also tatsächlich in einzelnen Buchstaben auf der anderen Seite ankommen. Hast du das bedacht?
GU_Meyer Threadstarter
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 1

Win 7
Delphi 5 Prof
BeitragVerfasst: Do 16.01.14 13:47 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Ein Link zu dem Tutorial wäre jetzt gut gewesen ;-)

Ok, das lässt sich machen :)
Teil 1 verlinke ich jetzt nicht, da es mir um den Teil 2 (www.entwickler-ecke....2+Sockets_65487.html) geht. Ichhabe praktisch die "Bildübertragung" durch meine Stringliste ersetzt.

user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Allgemeine gearentiert dir der Socket nur, dass die gleichen Daten ankommen, und in der richtigen Reihenfolge. Aber nicht, dass am anderen Ende nur genau ein Event ausgelöst wird!
Ein TServerSocket.SendText("Hallo") könnte also tatsächlich in einzelnen Buchstaben auf der anderen Seite ankommen. Hast du das bedacht?

Nein, hab ich nicht (mehr) :oops:
Das würde dann bedeuten, dass ich entweder ein komplett anderes Verfahren brauche oder zumindest meine Stringliste nochmal auf der Clientseite eigenhändig neu zusammensetzen muss - was noch das kleinste Übel wäre.

Danke erstmal

Gruss

GU_Meyer
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 16.01.14 14:29 
Moin und :welcome: in der EE!

Wenn du dich an die in dem Tutorial behandelten Erkenntnisse gehalten hast, dann sollte eigentlich das dort aufgebaute Protokoll die Paketierung übernehmen, sprich: deine Stringliste kommt auch als ein Datenpaket auf der Empfängerseite an. :idea:

Allerdings ist deine Schilderung doch recht allgemein gehalten, so dass ohne weitere Informationen (oder gar die entsprechenden Codeabschnitte) keine weitere Aussage möglich ist. :lupe:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
GU_Meyer Threadstarter
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 1

Win 7
Delphi 5 Prof
BeitragVerfasst: Do 16.01.14 15:31 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin und :welcome: in der EE!

Wenn du dich an die in dem Tutorial behandelten Erkenntnisse gehalten hast, dann sollte eigentlich das dort aufgebaute Protokoll die Paketierung übernehmen, sprich: deine Stringliste kommt auch als ein Datenpaket auf der Empfängerseite an. :idea:

Meine Stringliste kommt ja als Paket an. Alles, was ich auf der Serverseite "reinpacke", ist auf der Clientseite vorhanden. Das ist ja auch nicht, zumindest sehe ich das so, das Problem. Da ist dein Tutorial genial gemacht und hat mir viel Zeit gespart und meinen Wissenstand mindestens verdoppelt ;-) :zustimm:

Mich wundert einfach, dass meine empfangene Stringliste nach meiner Zählung 49 Elemente enthält, mit der Debugger für ServerDateiStrL.Count aber den Wert 70 anzeigt. Die 49 Elemente stimmen mit dem überein, was ich auf der Serverseite in die DateiStrL geschrieben habe. Wie kommt Pascal auf die 70, wenn ServerDateiStrL.Text nur 49 Elemente, getrennt durch #13#10, enthält? :?

Ich muss dazu sagen, dass meine Zählung so entstanden ist, dass ich den Inhalt von ServerDateiStrL.Text aus dem Debuggerfenster in einen Editor kopiert und dann die #13#10 jeweils durch einen Zeilenumbruch ersetzt habe. Dies hat mir dann 49 Zeilen ergeben. Aber unabhängig davon erhalte ich eine Zugriffsverletzung bei einer Schleife

ausblenden Quelltext
1:
2:
3:
4:
5:
for index:=0 to ServerDateiStrL.Count-1 do
begin
  // hier greife ich auf die einzelnen Elemente
  // über den Index zu
end;

sobald der index den Wert 49 überschreitet.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:

Allerdings ist deine Schilderung doch recht allgemein gehalten, so dass ohne weitere Informationen (oder gar die entsprechenden Codeabschnitte) keine weitere Aussage möglich ist. :lupe:

Wie gesagt, ich habe frühestens heut abend wieder Zugriff auf meinen Code, dann kann ich aber gern die hierfür relevanten Teile posten.

Gruss

GU_Meyer
GU_Meyer Threadstarter
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 1

Win 7
Delphi 5 Prof
BeitragVerfasst: Do 16.01.14 22:26 
Hallo,

hat sich geklärt. Weder die Stringliste zählt falsch, noch liegt der Fehler im Übertragungsverfahren. Der Fehler entsteht schon auf der Serverseite bei mir. Ich sammele die Dateien und Verzeichnisse rekursiv in einem Array. Dieses sortiere ich über eine etwas umständnliche Routine dann der Größe nach, wobei das Verzeichnis mit den meisten Einträgen an den Anfang kommt. Und bei diesem Sortieren entsteht der Fehler - und den habe ich vor ein paar Tagen selbst produziert und bis eben nicht gemerkt. Ergebnis ist, dass ich nicht eine Liste wie folgt (und ursprünglich geplant habe):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Groesstes_Verzeichnis
Dateiname_in_diesem_Verzeichnis
Dateiname_in_diesem_Verzeichnis
Naechst_kleineres_Verzeichnis
Dateiname_in_diesem_Verzeichnis

...usw.

sondern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Groesstes_Verzeichnis
Dateiname_in_diesem_Verzeichnis
Dateiname_in_diesem_Verzeichnis
Naechst_kleineres_Verzeichnis
Dateiname_in_diesem_Verzeichnis
Naechst_kleineres_Verzeichnis
Dateiname_in_diesem_Verzeichnis
Naechst_kleineres_Verzeichnis
Dateiname_in_diesem_Verzeichnis
Naechst_kleineres_Verzeichnis
Dateiname_in_diesem_Verzeichnis

usw.

Damit erklärt sich dann auch das ungewöhnliche Verhältnis der von mir gezählten und erwarteten Einträge und den real in der Stringliste vorhandenen.

Bitte entschuldigt, dass ich hier alles aufgeschreckt habe...! :oops:
Trotzdem vielen Dank fürs Mithelfen und Überlegen - ich verspreche, dass die nächste Frage vorher sorgfältiger durchdacht sein wird (dies ist mein erstes wirklich viel größeres Projekt, sozusagen wahrscheinlich mein Lebenswerk, wenn alles funktioniert und der Dateimananger nur noch ein Teil von ganz vielen ist).

Gruss

GU_Meyer

Für diesen Beitrag haben gedankt: Narses