![]() |
TIdTCPClient -Timer um auf Serveranfrage zu reagieren?
Moin !
Im Moment schlage ich mit mit TIdTCPClient und TIdTCPServer herum. Dabei bin ich auf ein interessantes Beispiel gestoßen von ![]() ![]() An sich ein schönes Beispiel (wie ich finde) um die beiden Komponenten zu verstehen. Zwar ist das eine Indy 9 Anwendung, aber mit ein bisserl Umstellung geht das durchaus auch unter Indy 10. Was mir dabei aufgefallen ist ist die Kommunikation vom Server zum Client. TIdTCPClient hat (im Gegensatz zu TIdTCPServer - OnExecute) ja kein eigenes Event um auf Datenempfang zu reagieren. Beim ScreenThief ist das nun so gelöst, das dort ein Timer pollt. Sprich alle paar ms sendet der Client eine Anfrage an den Server ob den für ihn ein Commando verfügbar ist. Der Server liefert dann das Commando zum Client. Auf der Client Seite schaut das in etwa so aus:
Delphi-Quellcode:
Das Konstrukt funktioniert, hat aber doch irgendwie einen faden Beigeschmack:
TCPClient.IOHandler.WriteLn('#'); //POLL Request zum Server
sCommand := TCPClient.IOHandler.ReadLn; // POLL Replay vom Server - Wenn der Server nicht antwortet kann sich der Client aufhängen wegen dem ReadLn - das Pollen erzeugt Netzwerklast - Bei mehreren schnell aufeinander folgenden Anfragen an den Client ist das Konstrukt suboptimal Frage ist nun ... Ist das gängige Praxis das man so vom Server zum Client kommuniziert? Oder gibt es da elegantere Lösungen? |
Re: TIdTCPClient -Timer um auf Serveranfrage zu reagieren?
ich schaue vorher immer mit
Delphi-Quellcode:
nach ob sich etwas im Buffer befindet bevor ich daraus lese.
if not tcpClient.IOHandler.InputBufferIsEmpty then
Hiermit lese ich den Buffer aus:
Delphi-Quellcode:
Und das alles passiert in einem Thread.
s:= tcpClient.IOHandler.InputBufferAsString;
Grüße Klaus |
Re: TIdTCPClient -Timer um auf Serveranfrage zu reagieren?
Moin Klaus,
und wiedermal treffen wir uns :thumb: Ich habe deinen code schon über die Suche gesehen. Ich denke mal es geht um das hier, oder? ![]() Wie synchronisierst du dann zwischen Thread und Client ? |
Re: TIdTCPClient -Timer um auf Serveranfrage zu reagieren?
Hallo Dominik,
ja, die Welt ist klein. Synchronisieren - eigentlich gar nicht. Der Server schickt ab und an etwas (Alarmmeldungen) dieses wird dann im Client wieder zusammengebaut und weiter verarbeitet. Die Daten vom Server sollten dann schon eine gewisse Endemarkierung haben, damit der Client feststellen kann hier ist die Nachricgt zu Ende. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz