AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy 10 tcp client server demo
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 tcp client server demo

Ein Thema von bernhard_LA · begonnen am 11. Apr 2012 · letzter Beitrag vom 28. Apr 2012
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

Indy 10 tcp client server demo

  Alt 11. Apr 2012, 23:47
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
Miniaturansicht angehängter Grafiken
sample-3-complex-demo-screen-dump.jpg  

Geändert von bernhard_LA (12. Apr 2012 um 08:24 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Indy 10 tcp client server demo

  Alt 21. Apr 2012, 22:21
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

AW: Indy 10 tcp client server demo

  Alt 25. Apr 2012, 11:03
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:
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Indy 10 tcp client server demo

  Alt 25. Apr 2012, 14:21
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.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Indy 10 tcp client server demo

  Alt 28. Apr 2012, 12:47
demo #3 will immer noch nicht

habe alle debug Infomationsausgaben auf der Server.execute Seite Memo1.lines.add (...) durch ...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
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:21 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