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
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 :( |
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 |
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:
Geht so nicht. Auch der Zugriff auf gemeinsame Ressourcen muss geschützt sein,
Memo1.lines.add('blaBla');
Delphi-Quellcode:
BEnutzung des Bmps:
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 ?
Delphi-Quellcode:
// Jeder Client braucht sein eigenes Bmp !!
3:
begin /// Memo1.Lines.Add('record received AND JOB done!'); abmp.Height := 300; abmp.Width := 300; DrawRandomBitMap(abmp); ServerImage.Picture.Bitmap.Assign(abmp); 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:
Des Weiteren solltest Du solche Boolean Vergleiche lassen:
result := false;
try // sende ... // ... finally // ... end; result := true; // wird immer gesetzt, egal ob ein Fehler auftritt oder nicht
Delphi-Quellcode:
Einen letzten Tipp habe ich für Dich noch; Ich würde(so mache ich es meistens auf jeden Fall)
if (SendBuffer(AContext, LBuffer) = False) then // falsch, gibts genug Threads zu dem Thema
// richtig: if not (SendBuffer(AContext, LBuffer)) then ... eine Klasse TMyClient definieren diese pro Connection wie folgt verwenden:
Delphi-Quellcode:
Hoffe das bringt Dich ein wenig weiter,
// 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; // ... Greetz Data |
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. |
AW: Indy 10 tcp client server demo
demo #3 will immer noch nicht :-(
habe alle debug Infomationsausgaben auf der Server.execute Seite
Delphi-Quellcode:
durch
Memo1.lines.add (...)
Delphi-Quellcode:
ersetzt.
...TIdNotify.NotifyMethod( .... )
Leider immer noch kein Erfolg. Ferner habe ich die Record definitionen Thread safe gemacht (siehe unten), kein Erfolg
Delphi-Quellcode:
Vom Debugging her:
TMyRECORDThreadSafeRecord = class(TIdThreadSafe)
value : TMyRecord; end; TINDYCMDThreadSafeRecord = class(TIdThreadSafe) value : TINDYCMD; end; 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