AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TIdTCPServer / TIdTCPClient => Ping - Pong
Thema durchsuchen
Ansicht
Themen-Optionen

TIdTCPServer / TIdTCPClient => Ping - Pong

Ein Thema von Jackie1983 · begonnen am 21. Jun 2010 · letzter Beitrag vom 22. Jun 2010
Antwort Antwort
Seite 1 von 2  1 2      
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 13:15
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:
  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;
Und der Server -> OnRead
Delphi-Quellcode:
  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;
Soweit funktioniert der Test bei 2 Computer. Gibt es noch was wo drauf ich achten muss oder eventuell was ich besser machen kann.

Mfg
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#2

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 14:03
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....

Geändert von Jackie1983 (21. Jun 2010 um 14:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 14:31
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#4

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 14:47
Hi DataCool,

also....
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.
Die CS ist damit wenn der Server gerade list nicht wo anders am Server OnWrite aufgerufen wird. Oder ist das CS zu viel, habe das gleich auch am Client.
Habe die Funktion nur OnRead genannt. msg ist local.

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.
Ein leerstring sollte eigentlich nicht kommen. Und wenn doch kann ich eh nichts damit anfangen. Also bei einem fehler, meist Timeout, soll nicht weiter gemacht werden, falsch?

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.
Habe ich, nur wenn das Kabel gezogen wird muss der Server und der Client das ja auch mitbekommen und die verbindung trennen und wieder aufbauen.

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.
Ja benutze die 9er. Hmm ok dann werde ich mal die 10er suchen und installieren. Denke dazu muss ich die 9er komplett löschen?

Mfg
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 15:08
HI Jackie,

1.
Zitat:
Die CS ist damit wenn der Server gerade list nicht wo anders am Server OnWrite aufgerufen wird. Oder ist das CS zu viel, habe das gleich auch am Client.
Habe die Funktion nur OnRead genannt. msg ist local.
Die CS solltest Du auf jeden Fall rausschmeissen, im Client kann das sinnvoll und notwendig sein. Im Server allerdings läuft jedes OnExecute(bei Dir OnRead) innerhalb eines eigenen Threads und wenn sdie Variable "msg" sowieso lokal ist, gibt es keinerlei GRund diese mit einer CS zu schützen ,auf jeden Fall sehe ich keinen auf Basis der Codeschnipsel.

2.
Zitat:
Ein leerstring sollte eigentlich nicht kommen. Und wenn doch kann ich eh nichts damit anfangen. Also bei einem fehler, meist Timeout, soll nicht weiter gemacht werden, falsch?
Recht hast Du, ich war mit meiner etwas zu voreilig, das liegt allerdings dran das ich das ganze immer ohne Exception löse.
In Indy10 würde das dann so aussehen :
Delphi-Quellcode:
  // 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 !
  // ...
In Indy9 sollte der Code auch funktionieren Du must nur AConntext durch AThread ersetzen und das IOHandler in der Mitte weg lassen.

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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#6

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 15:41
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
http://www.indyproject.org/Sockets/D...lation.de.aspx
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 15:53
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#8

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 16:09
Habe Delphi 2007 Enterprise.
Oh, da gibt es auch noch mehrere Versionen.
Von wo bekomme ich die?
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 16:21
Hi,

schau mal hier.

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.
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#10

AW: TIdTCPServer / TIdTCPClient => Ping - Pong

  Alt 21. Jun 2010, 16:33
Hi,

danke für den Link.
Ist die Reihenfolge jetzt anders bei der Installation wie oben
in der Anleitung?
Gute frage, ich weis es nicht...

//Edit
Habe das ganze jetzt wie folgt installiert
Zitat:
Path Run-time Package Design-time Package
.\System IndySystem70.dpk n/a
.\Core IndyCore70.dpk dclIndyCore70.dpk
.\Protocols IndyProtocols70.dpk dclIndyProtocols70.dpk

.\SuperCore IndySuperCore70.dpk dclIndySuperCore70.dpk
Dann habe ich mir die Demos von der Seite geladen. Wollte die Anwendung Chat2.0 testen.
Fehler, datei IdCoreGlobal nicht gefunden....

Geändert von Jackie1983 (21. Jun 2010 um 16:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 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