Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy 10 tcp client server demo (https://www.delphipraxis.net/167662-indy-10-tcp-client-server-demo.html)

bernhard_LA 11. Apr 2012 22:47

Indy 10 tcp client server demo
 
Liste der Anhänge anzeigen (Anzahl: 1)
unter http://sourceforge.net/projects/indy10clieservr/ habe ich einige DEMOS für TCP/IP Kommunikation mit den INDY 10 Komponenten erstellt.

unter http://indy10clieservr.svn.sourcefor...RecordVersion/ gibt es ein Beispiel wir ich flexibel über GENERICS verschiedene Record Typen zwischen Client und Server hin und her schicken kann. Das ganze Projekt funktioniert bei mir, ich hoffe eine ziemlich flexible / erweiterbare Lösung hiermit gefunden zu haben


unter http://indy10clieservr.svn.sourcefor...omplex%20demo/ nun eine Erweiterung bzw. Kombination der verschiedenen Demos.

Benutzung der Demo 3 "COMPLEX DEMO" wie folgt
  1. Server starten ( Klicke auf Set Server Bindings, Server läuft dann auf 127.0.0.1 und Port 5000 ), wer zwei PCs im Netz hat kann auch andere IP Nummern dann einstellen
  2. Client starten , Klick auf Set Communcation Paramter, Client wird dann auf 127.0.0.1 und Port 5000 gestartet
  3. auf Client ein Command auswählen, #0 sendet einen String an den Server, Client Connect anhacken und execute Buton drücken,
    String wird zum Server geschickt, Time Out ist auf 9 sec eingestellt, vor dem Time out rechtzeit den Client abtrennen
  4. CMD#1 und CMD#2 tauschen nun analog zur demo #2C Records aus.
    CMD#1 schicht ein TINDYRecord zum Server und erwartet ein TINDYRecord vom Server zurück.
    CMD#2 schickt ebenfalls ein TINDYREcord zum Server erwartet aber ein TMyrecord vom Server zurück
    nur leider funktioniren CMD#1 und CMD#2 nicht, der Server weigert sich standhaft Daten an den Client zurück zu schicken.
    wer die DEMO 2C runterlädt und ausprobiert sollte feststellen , ich kann mit nachzu dem selben Server - Execute Code
    beim Sample 2C fehlerfrei die Records austauschen
  5. um den Client beim CMD#1 und CMD#2 zu testen kann ic h auf den Server aus DEMO 2C verwenden, für CMD#1 muss ich beim Server
    bei Send und receive TINDYCMD auswählen und bei CMD#2 für empfangen TINDYCMD und für Send TMyRecord, der Client aus der DEMO 3 sollte damit dann spielen

Frage hier im Forum :

in der DEMO 2C kann ich verschiedene Record senden und empfangen. Im Prinzip ist der identische Code in der Demo 3 eingebaut,
nur in der Demo 3 kann ich kein Record vom Server im Client empfangen in der Demo 2C geht alles fehlerfrei.

Was mache ich falsch, wo liegt der Fehler im Server in der DEMO 3 :(

bernhard_LA 21. Apr 2012 21:21

AW: Indy 10 tcp client server demo
 
Ps: gibt jetzt noch weitereb demos , Zb. record senden Stream zurück empfangen ....
geht alles prima, nur der Bug in DEMO 3 will sich nicht finden lassen
warte immer noch auf Hilfe

DataCool 25. Apr 2012 10:03

AW: Indy 10 tcp client server demo
 
Hi Bernhard,

habe mir gerade nur den Code im Server angeschaut und da sind mir
auf Anhieb ein paar Probleme aufgefallen:
- Im OnExecute des IndyServers muss der komplette Code Thread-Safe sein,
weil er innerhalb des Conntext eines Threads abläuft, das bedeutet sämtliche
VCL-Gui Zugriffe müssen Thread-Safe sein:
Delphi-Quellcode:
Memo1.lines.add('blaBla');
Geht so nicht. Auch der Zugriff auf gemeinsame Ressourcen muss geschützt sein,
Delphi-Quellcode:
  public
    { Public-Deklarationen }

    abmp: TBitMap;                  // <---- nicht Thread-Safe

    aMyRecordIndy: TMyThreadSafeRecord;
    // ^^ hört sich Thread Safe ein, aber wenn 2 Clients gleichzeitig connecten
    // und den Record benutzen, was passiert dann ?
BEnutzung des Bmps:
Delphi-Quellcode:
    3:
      begin
        ///
        Memo1.Lines.Add('record received AND JOB done!');

        abmp.Height := 300;
        abmp.Width := 300;

        DrawRandomBitMap(abmp);

        ServerImage.Picture.Bitmap.Assign(abmp);
// Jeder Client braucht sein eigenes Bmp !!

Des Weiteren habe ich im SVN nicht die Units gefunden:
Unit_Indy_Functions, Unit_Indy_Classes;

Wenn die Function SendStream dort noch wie in den anderen Threads von Dir so existiert,
das
Delphi-Quellcode:
  result := false;
  try
    // sende ...
    // ...
  finally
    // ...
  end;
  result := true; // wird immer gesetzt, egal ob ein Fehler auftritt oder nicht
Des Weiteren solltest Du solche Boolean Vergleiche lassen:
Delphi-Quellcode:
  if (SendBuffer(AContext, LBuffer) = False) then // falsch, gibts genug Threads zu dem Thema

  // richtig:
  if not (SendBuffer(AContext, LBuffer)) then ...
Einen letzten Tipp habe ich für Dich noch; Ich würde(so mache ich es meistens auf jeden Fall)
eine Klasse TMyClient definieren diese pro Connection wie folgt verwenden:
Delphi-Quellcode:
// Im OnConnect
  AContext.Data := TMyClient.Create;

// Im OnDisConnect:
  If Assigned(AContext.Data) then
  begin
    if AContext.Data is TMyClient then
      TMyClient(AContext.Data).Free;
    AContext.Data := nil; // auf jeden Fall auf nil setzen, sonst versucht Indy das ganze freizugeben
  end;

// Im OnExecute
var myClient : TMyClient;
begin
  // ....
  try
    myClient := TMyClient(AContext.Data);
  except
    myClient := nil;
  end;

  if Assigned(myClient) then
  begin
    // je nach Definition des TMyClients Object hast Du jetzt geschützte Ressouren pro Client
    // also Daten/Infos darein oder als lokale Var im OnExecute des Servers

  end;

  // ...
Hoffe das bringt Dich ein wenig weiter,

Greetz Data

bernhard_LA 25. Apr 2012 13:21

AW: Indy 10 tcp client server demo
 
vielen vielen dank für die inputs !!!!!!!

im svn ordner shared http://indy10clieservr.svn.sourcefor...eservr/Shared/ befinden sich die anderen units, kannst du bitte auch hierzu noch einen komentar abgeben

ich habe aktuell über 100 downloads die woche, ich denke die delphi community sucht ganz dringend fehlerfreie examples für indy 10 und tcp ip server.

bernhard_LA 28. Apr 2012 11:47

AW: Indy 10 tcp client server demo
 
demo #3 will immer noch nicht :-(

habe alle debug Infomationsausgaben auf der Server.execute Seite
Delphi-Quellcode:
Memo1.lines.add (...)
durch
Delphi-Quellcode:
...TIdNotify.NotifyMethod( .... )
ersetzt.
Leider immer noch kein Erfolg. Ferner habe ich die Record definitionen Thread safe gemacht (siehe unten), kein Erfolg

Delphi-Quellcode:
   TMyRECORDThreadSafeRecord = class(TIdThreadSafe)
          value  : TMyRecord;
  end;


  TINDYCMDThreadSafeRecord = class(TIdThreadSafe)
          value  : TINDYCMD;
  end;
Vom Debugging her:
der Client in der Demo 3 (Complex sample) spielt mit dem Server von der DEMO 2C wunderbar (Test um 2 verschiedenen Records zwischen Client und Server auszutauschen) Der Client von Demo 3 und der Server von Demo 3 können aber diese Records nicht austauschen obwohl der Code aus meiner Sicht identisch ist. Den String zu Übertragen klappt beim Server DEmo 3 . Auch BMP zeichen scheint zu spielen. Durch die Abänderungen von Oben müsste ich doch jetzt auch Thread safe sein ?
Bin für jeden Input zum BugFixing Dankbar


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