![]() |
TIdTCPServer / TIdTCPClient => Ping - Pong
Hi,
bei meiner Anwendung muss immer eine Verbindung mit dem Server bestehen. Habe das früher mit den Sockets gemacht, da hat es so funktioniert. Jetzt wo ich das mit den Indys mache und alles auf Threads basiert, weis ich nicht ob das immer noch so funktionieren würde. Das ist der Client Execute, gekürzt.
Delphi-Quellcode:
Und der Server -> OnRead
while not Terminated do begin
if not fClient.Connected then try fClient.Connect(1000); except end; //Ping senden if fClient.Connected then begin cmd := TCommandHandling.Create(CMDPing); try fClient.WriteLn(cmd.SendFrames); msg := fClient.ReadLn; //Antwort cmdPong except fClient.Disconnect; //Timeout, kein Pong bekommen. end; end; //Text empfangen if fClient.Connected then begin try try IsTimeout := false; msg := fClient.ReadLn; except IsTimeout := True; end; if not IsTimeout then begin cmd := TCommandHandling.Create(CMDNone); try cmd.SetFrames(msg); try if Assigned(fOnRead) then fOnRead(cmd); except //Fehler in OnRead abfangen end; finally FreeAndNil(cmd); end; end; finally fCS.Leave; end; end; sleep(100); end;
Delphi-Quellcode:
Soweit funktioniert der Test bei 2 Computer. Gibt es noch was wo drauf ich achten muss oder eventuell was ich besser machen kann.
AThread.Connection.ReadTimeout := 1000;
fCS.Enter; try try msg := AThread.Connection.ReadLn; except exit; end; finally fCS.Leave; end; cmd := TCommandHandling.Create(CMDPong); try cmd.SetFrames(msg); if cmd.GetCmd = CMDPing then AThread.Connection.WriteLn(cmd.SendFrames) //Pong senden else begin //rest weiter geben if Assigned(fOnRead) then fOnRead(AThread, cmd); end; finally FreeAndNil(cmd); end; Mfg |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
Ok so wie ich es jetzt gemacht habe geht es nicht.
Habe im Client einfach per Timer text gesendet und im Server den Text einfach wieder zum Client zurück gesendet. Da kommt nur alle paar Sekunden was an, wenn überhaupt. Irgend wo habe ich da noch einen Fehler.... //Edit Nach einer Zeit friert der gesamte Client ein. Habe jetzt den Text am Client mal nicht in der Listbox angezeigt und so funktioniert es. So sehe ich nicht ob Text angekommen ist, müste schon, aber die Anwendung läuft weiter... So schwer bzw. anders kann es doch gar nicht sein.... |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
Hi Jackie,
1. Wozu soll die CriticalSection im OnExecute des Server sein(hoffe Du meinst OnExecute, denn geschrieben hast Du OnRead) Deine var msg, solltest Du einfach lokal im OnExecute deklarieren. 2. Sollte Dir bewußt sein, das das OnExecute des Servers andauerd hintereinander aufgerufen wird(solange wie Client verbunden ist), so kann es auch mal passieren das DEin AThread.Connection.ReadLn; nichts(Lerrstring) zurück liefert, diesen Fall solltest Du abfangen und nicht Dein Event feuern. 3. Sollte es ein Kommando für das saubere Abmelden des Clients geben, z.B. Client sendet "QUIT", Server und Client trennen danach die Verbindung sauber. 4. Benutzt Du noch die 9er Version der Indys, das an sich ist kein Problem ich habe auch noch ein paar Projekte damit laufen, generell sollte man aber bei Neuentwicklungen jetzt auf die 10er Version setzen. Greetz Data |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
Hi DataCool,
also.... Zitat:
Habe die Funktion nur OnRead genannt. msg ist local. Zitat:
Zitat:
Zitat:
Mfg |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
HI Jackie,
1. Zitat:
2. Zitat:
In Indy10 würde das dann so aussehen :
Delphi-Quellcode:
In Indy9 sollte der Code auch funktionieren Du must nur AConntext durch AThread ersetzen und das IOHandler in der Mitte weg lassen.
// Bis max. 2,5 Sekunden warten das Daten erfolgreich in den Buffer geschrieben wurden
AContext.Connection.IOHandler.CheckForDataOnSource(2500); // Prüfen, ob die Client Verbindung noch besteht, eventuell hat der Server beim CheckForDataOnSource festgestellt das die Verbindung weg ist if not AContext.Connection.Connected then exit; // Sind keine Daten im Buffer, dann raus if AContext.Connection.IOHandler.InputBufferIsEmpty then exit; // hier jetzt weiter mit ReadLN ... sind jetzt auf jeden Fall Daten zum Lesen da ! // ... 3. Ok, dann ist ja alles gut ;-) 4. Zur Umstellung von Indy9 auf Indy10 existieren hier einige Threads, das ganze ist je nach Delphi Version mit ein bisschen "Handarbeit" verbunden. Deshalb hängt es von der größere des Projekts und DEiner aktuellen Entwicklungsumgebung ab ob es jetzt wirklich ratsam ist auf Indy10 umzustellen, oder ob für Deine Belange Indy9 absolut ausreichend ist. Eine großere Änderung von Indy9 zu Indy10 ist, das nicht mehr jede Connection Ihren eigenen Thread hat, sondern das es einen "Thread-Pool" gibt, der freie Threads an die verschiedenen Clients verteilt. Greetz Data |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
ok bin schon dabei die 10er zu installieren, weil wenn ich das schon neu mache dann kann ich auch die 10 nehmen. Habe bei der Installation schon einige Probleme. Die Demos funktionieren nicht, es können eigenschaften nicht gefunden werden so wie ganze units, obwohl ich die alles gesetzt habe.
Habe es nach dieser Anleitung gemacht ![]() |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
Hi,
da gibt es hier im Forum weitaus genauere Anleitungen, ganz entscheided für die Sache ist allerdings, welche Delphi-Version Du benutzt ?! Und auch welche Indy-Version Du Dir gezogen hast ?! Die ist nämlich im Moment gespalten, empfehle Dir den "Tiburon-Branch" empfehlen. Greetz Data |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
Habe Delphi 2007 Enterprise.
Oh, da gibt es auch noch mehrere Versionen. Von wo bekomme ich die? |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
Hi,
schau mal ![]() Greetz Data P.S.: Bei Delphi2007 sollten eigentlich die Indy in einer frühen Version der 10er(10.1.5 oder 10.2.3) mit dabei sein, bin mir eigentlich ziemlich sicher, frage mich wie Du zu Indy9 kommst. |
AW: TIdTCPServer / TIdTCPClient => Ping - Pong
Hi,
danke für den Link. Ist die Reihenfolge jetzt anders bei der Installation wie oben in der Anleitung?:stupid: Gute frage, ich weis es nicht... //Edit Habe das ganze jetzt wie folgt installiert Zitat:
Fehler, datei IdCoreGlobal nicht gefunden.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 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