Guten Morgen zusammen,
basierend auf diesem Thread, habe ich eine
Indy Server und Client Anwendung:
https://www.delphipraxis.net/216803-...nge-tcpip.html
Dabei ist mir allerdings folgendes aufgefallen:
1) erstmal die Aufgabenstellung:
Ich muss vom
Server viele Daten zum Client senden und der Client auch genau in der Reihenfolge abarbeiten/verarbeiten.
"Viele Daten" können zwischen 20 und 80 Datensätze (alle unterschiedlich!) pro Sekunde sein. Es dürfen sich keine Datensätze überholen bzw ausfallen. Die Telegramme können zwischen 13 Byte und max 61000 Byte lang sein!
Der Ausfall wird über Connect/Disconnect erkannt.
Dafür wollte ich
Indy TCPIP nehmen. Verbindungsaufbau und -abbau klappt soweit, kein Problem.
2) Beobachtungen im Client:
Datensätze werden im Client im einem Thread eingelesen und zwar so:
Delphi-Quellcode:
IdTCPClient1.IOHandler.CheckForDataOnSource(10);
if not IdTCPClient1.IOHandler.InputBufferIsEmpty then
begin
InData := IdTCPClient1.IOHandler.ReadLn('#~#*' + EOL, 100, -1, IndyTextEncoding_UTF8);
if InData <> '' then
begin
//mach irgendwas damit
end;
end;
Dabei ist mir aufgefallen, dass der Client die Datensätze nicht in der Geschwindigkeit abholen kann, wie der
Server sie mit WriteLn schickt. Auch mit dem Timeout (100) habe ich schon rumgespielt (erhöht, verringert), keine Besserung. Der Client hängt merklich hinterher. Wenn ich im
Server das Senden unterdrücke, kann man beim Client richtig zugucken, wie die ReadLn Befehle weiter arbeiten und noch Datensätze abgeholt werden obwohl der
Server ja eigentlich nicht mehr schickt (die sind also gepuffert). Das mit dem Puffer ist ja erstmal nicht schlecht, aber der Client kann den
Server nie wieder "einholen" wenn der
Server aktiv weiterschicken würde. Im Gegenteil, das "hinterherhängen" wird immer schlimmer.
Zur Info, der
Server schickt mit WriteLn und Terminator.
3) Frage:
Ist TCPIP dafür überhaupt der richtige Ansatz für meine Aufgabenstellung? Gibt es eine andere Möglichkeit, Daten von einem
Server an einem Client in dieser Geschwindigkeit zu schicken und der Client kann diese auch entsprechend verarbeiten? Also wenn der Client mal "bisschen" hinterher hängt, ist ja nicht schlimm aber es darf nicht immer mehr werden. Mit UDP habe ich mal versucht, dass ist natürlich super schnell aber da überholen sich Telegramme und es fallen auch welche aus (ich weiß warum, deswegen fällt UDP raus).
Wie würdet ihr das versuchen zu lösen?