Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy 10: String-Limit für Server-Client-Kommunikation? (https://www.delphipraxis.net/78547-indy-10-string-limit-fuer-server-client-kommunikation.html)

Klaxon 6. Okt 2006 19:01


Indy 10: String-Limit für Server-Client-Kommunikation?
 
Hallo,

bei meinem Programm schicke ich Strings vom Server zum Client mit den idTCP-Komponenten. Alles funktioniert gut, aber nach ca. 11 000 Buchstaben wird die Verbindung getrennt("Closed Connection Gracefully"). Die Zeit spielt da wirklich keine Rolle, ich habe verschiedene Zeitabstände und Stringlängen getestet, aber es sind immer ca. 11 000 Characters, die dann zum Abbruch führen.

Wo und wie stellt man denn da ein mögliches Limit ein? Würde mich über Hilfe sehr freuen.

Danke und Gruß,
Klaxon.

Klaxon 11. Okt 2006 18:33

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
Hallo,

ich habe inzwischen gesehen, das viele mit der Fehlermeldung "Connection Closed Gracefully" kämpfen. Leider habe ich keinen Ansatz dafür, mein Problem zu lösen. Warum sorgt eine gewisse Menge an geschickten Strings für diese Meldung? Hat niemand eine Idee? :gruebel:

Ich benutze übrigens Delphi 2006. Ich kann auch den Code posten, falls das nötig sein sollte.

Vielen Dank,
Klaxon.

Zacherl 11. Okt 2006 19:19

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
Guck dir mal BufferSize oder MaxBufferSize an ... Das ist eine Property der Komponenten. Ansonsten habe ich vor 3 Tagen ein Protokoll für die Sockets in der CodeLib gepostet, welches lange Strings auch getrennt übermitteln kann. Natürlich ist das ganze auch sehr leicht auf die Indys zu poertieren.

Florian

Klaxon 12. Okt 2006 09:52

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
@Florian Bernd

Danke für den Hinweis, ich hatte schon befürchtet dass mir niemand antwortet.

Aber ich muss glaube ich genauer erklären was ich mache. Ich möchte nämlich nicht einen String mit 11000 Zeichen verschicken, wofür dann dein Protokoll und evtl. Buffersize interessant wäre. Der Server soll Strings mit einer Länge von genau 436 Zeichen schicken. Das Ganze funktioniert genau 27 Mal, danach kommt die Fehlermeldung. Wenn ich die Stringlänge auf die Hälfte verkürze, schafft er es doppelt so oft, es liegt also irgendwie an der Menge an Zeichen, die verschickt werden.

Die Kommunikation läuft so: Der Client macht timergesteuert ein Read-Befehl, worauf der Server ein Writeln macht(im OnExecute-Ereignis).

Bin für jeden Tipp dankbar,
David.

Zacherl 12. Okt 2006 19:00

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
Vermutlich sind die Komponenten einfach überfordert. Nimm einfach mal mein Protokoll und sende damit den String nicht als Ganzes, sondern in kleinere Teile gesplittet ...

Florian

Klaxon 16. Okt 2006 09:52

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
Vielen Dank für den Vorschlag. Aber bevor ich mich mit dem konvertieren/anpassen deines Protokolls für meine Software beschäftige, muss ich erwähnen, dass es absolute Vorraussetzung meiner Software ist, dass die Strings so schnell wie möglich beim Clienten ankommen und nur zusammenhängend ausgewertet werden können. Ein Schicken von kleinen Paketen hintereinander wäre wahrscheinlich mit einer zu großen Zeitverzögerung verbunden.

Übrigens habe ich es auch schon mit kleinen Paketen versucht, da kam die genannte Fehlermeldung dann halt nach 15 Minuten. Würde dein Protokoll da wirklich Abhilfe schaffen, also die Dinge so entscheidend anders machen?
Vielleicht ist ja auch mein Code unglücklich, warum hatte sonst nie jemand mit diesem Problem zu kämpfen. :gruebel:

Server:

Delphi-Quellcode:
procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
begin
          AContext.Connection.iohandler.WriteLn(s);
end;
Client:

Delphi-Quellcode:
procedure TForm1.GetData;
 begin
with TCPClient do begin
    try
      S:=IOHandler.ReadLn;
    finally
      Disconnect;
    end;
  end;
 end;
Also wirklich so simpel wie möglich. Das GetData wird dann timergesteuert aufgerufen.

Vielen Dank,
Klaxon.

Zacherl 16. Okt 2006 13:28

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
In welchem Intervall rufst du GetData auf? Minimal würde ich 500ms einstellen, weil es sonst öfters zu Problemen kommt.

Dann noch zum Protokoll von mir:
Also erstens werden die 10000 Zeichen sowieso nicht alle auf einmal versendet, sondern erst vom Server wieder zusammengesetzt und du könntest das Protkoll so einsetzen, wie es mittlerweile als Unit im Forum "Neuen Beitrag zur codeLib hinzufügen" vorhanden ist.

Mit der Funktion GetCMDString kannst du einen Befehlscode erstellen, bzw mit der Funktion GetLimitedCMDString erstellst du mehrere String Teile, die den Befehlscode enthalten.

Ein Beispiel zum Parsen der Befehle ist auch dabei.

Florian

Klaxon 17. Okt 2006 10:01

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
JUHU! :dancer:

Ich habe den Fehlerverursacher gefunden. Das "Disconnect" in der finally-Sektion beim Client hat wohl die Verbindung getrennt. Mir ist zwar noch nicht ganz klar, warum es überhaupt ausgeführt wurde, aber man kann sich ja schon vorstellen, dass mal ein "readln" fehlschlägt.

Vielen Dank für Deine versuchte Hilfe Florian!

Was für ein geniales Gefühl, dieses Problem beschäftigt mich schon ewig...

Gruß,
Klaxon.

Zacherl 17. Okt 2006 12:12

Re: Indy 10: String-Limit für Server-Client-Kommunikation?
 
Manchmal sieht man den Wald vor lauter Bäumen nicht :wall: Hätte ich ja auch merken müssen ...

Der unterschied von try ... finally ... end zu try ... except ... end ist, dass im finally Block der Code aufjeden Fall ausgeführt wird, auch wenn zwischen try und finally ein Fehler auftritt.
Im try except Block wird der Code zwischen except und end nur dann ausgeführt, wenn zwischen try und except ein Fehler auftritt.

Also verwende einfach except statt finally :)

Florian


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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