Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Indy-Komponenten (https://www.delphipraxis.net/92356-indy-komponenten.html)

blablab 18. Mai 2007 13:32


Indy-Komponenten
 
Hallo!

Ich dachte immer, man kann die Indy-Komponenten mit den restlichen Komponenten die Delphi bereitstellt vergleichen. Aber kann es sein, dass die Indy-Komponenten um einiges schlechter sind?

Ich hab bis jetzt die Komponenten nur für Http, TCP und UDP verwendet. Aber ich hab damit schon relativ viel schlechte Erfahrungen gemacht.
Z.B bekommt der Server der TCP oder UDP Komponente ein Ereignis bei einer eintreffenden Nachricht, der Client nicht. Beim Client muss man dann selbst pollen und lustigerweise blockiert das dann die Anwendung und man braucht zusätzlich eine Anti-Freeze-Komponente...
Und zb bei der idHttP-Komponente ist mir aufgefallen, dass es bei Get() kein einheitliches TimeOut gibt. (Und selbst einstellen kann man das TimeOut dummerweise auch nicht...) Mal bricht er das Verbinden nach 5s ab, mal erst nach 20s. Und es ist bei mir auch schon vorgekommen, dass Get() überhaupt nicht mehr abgebrochen hat, so dass ich das Programm dann nach einer halben Stunde beenden musste.
Und außerdem brauchen die Komponenten zusätzlich noch sehr viel Speicherplatz, wobei mir das eigentlich egal wäre, würden sie wenigstens gescheit funktionieren...

Was ich eigentlich fragen wollte ist, ob ihr auch so schlechte Erfahrungen mit den Indy-Komponenten gemacht habt? Benutzt ihr oft diese Komponenten oder weicht ihr auf andere Lösungen aus? Ist das bei anderen Indy-Komponenten auch so?
Kurz: Was haltet ihr von den Indy-Komponenten?

Simon

CCRDude 18. Mai 2007 13:37

Re: Indy-Komponenten
 
Sag doch erstmal vorab, ob Du Dich auf Indy 9 oder Indy 10 beziehst?

Indy 9 finde ich teilweise auch ziemlich übel - ist nicht wirklich sauber, sprich beim Beenden eines Programmes, das Indy 9-Komponenten benutzt, wird beispielsweise eine TCriticalSection nicht korrekt freigegeben. Unter Vista macht das teilweise richtig Probleme.

Ich benutze inzwischen Synapse und/oder die Wininet-API, wobei ich neulich auch mal einen Blick auf Indy 10 geworfen habe und das besser als Indy 9 finde.

Udontknow 18. Mai 2007 13:47

Re: Indy-Komponenten
 
Hallo!

Bezüglich TCP: Der Server hat eben kein Ereignis für ankommende Daten. OnExecute ist nur die Routine, die vom für die Verbindung bereitgestellten Thread angestossen wird, es wird direkt beim Connect angestossen. Mit dem Empfang von Daten hat das Ereignis nichts zu tun, dafür musst du ja dort auch wieder Read /Readln etc. aufrufen. Da der Server eben auch immer einen neuen Thread für eine Verbindung kreiert, gibt es dort kein "Blocking" des VCL-Threads.

Wie sollte Indy denn deiner Meinung nach das beim Client realisieren? Soll bei jedem eintreffenden Byte ein Ereignis getriggert werden? ;-)

Im Client musst du eben das Einlesen von Daten selber managen. Schau dir doch mal die SimpleTCP-Komponenten von mir an, dort realisiere ich es so, daß in einem separaten Thread Daten gesammelt werden und erst bei "Vollständigkeit" (bei mir komplette Übertragung eines Streams) per Synchronize ein Event getriggert wird.

Cu,
Udontknow

alzaimar 18. Mai 2007 14:26

Re: Indy-Komponenten
 
Die ICS-Komponenten von Francois Piette (www.overbyte.be) sind auch ziemlich generisch. Dort fliegen dir die Events nur so um die Ohren.

Soweit ich das kapiert habe, sind die Indies auf Einfachheit und Usability ausgelegt, u.U. mit Einschränkungen (was bei so einer Prämisse nicht auszuschließen ist). Genau weiß ich das aber nicht.

Meflin 18. Mai 2007 14:32

Re: Indy-Komponenten
 
Was ich von den Indys halte?

Das beste, was du zu dem Preis bekommst. Und ob die kostenpflichtigen Alternativen so viel besser sind, wage ich zu bezweifeln. Denn die Indys sind insgesamt doch ziemlich gut! Ich persönlich kann deine schlechten Erfahrungen auch nicht teilen, habe selbst eigentlich nur gute gemacht ;)


blablab 18. Mai 2007 17:08

Re: Indy-Komponenten
 
@CCRDude: Ich weiß net so genau welche Version das ist. Da sie beim Delphi dabei war und ich nicht extra Indy 10 installiert habe behaupte ich mal dass ich mich auf Indy 9 beziehe.

Zitat:

Zitat von Udontknow
Wie sollte Indy denn deiner Meinung nach das beim Client realisieren? Soll bei jedem eintreffenden Byte ein Ereignis getriggert werden?

Ich versteh nicht ganz wieso ich bei jedem Byte n Ereignis bekommen sollte... Das ist doch beim Server au net so. Ich hätte es gerne so realisiert wie auch beim Server.
Oder findest du es etwa gut, jedesmal noch eine extra Anti-Freeze-Komponente zu benutzen?
Und ich glaub, wenn mans beim Server au selber triggern müsste, wärs mir auch relativ egal. Es sollte halt zumindest einheitlich sein und wenn möglich ohne zusätzliche Anti-Freeze-Komponente funktionieren.

@Meflin:
Da hast du natürlich recht, das Preis-Leistungs-Verhältnis ist natürlich perfekt!
Ich hab mich nur gewundert, dass ich bei den Indy-Komponenten auf so viele unschönheiten gestoßen bin, wo das bei den anderen Komponenten nirgens so ist.
Deshalb dachte ich mir, ich frag mal nach eurer Meinung...

Udontknow 18. Mai 2007 17:12

Re: Indy-Komponenten
 
Zitat:

Zitat von blablab
Zitat:

Zitat von Udontknow
Wie sollte Indy denn deiner Meinung nach das beim Client realisieren? Soll bei jedem eintreffenden Byte ein Ereignis getriggert werden?

Ich versteh nicht ganz wieso ich bei jedem Byte n Ereignis bekommen sollte... Das ist doch beim Server au net so. Ich hätte es gerne so realisiert wie auch beim Server.
Oder findest du es etwa gut, jedesmal noch eine extra Anti-Freeze-Komponente zu benutzen?

Ich hab´s bereits geschrieben: Der Server hat eben KEIN Ereignis für Datenempfang! Und genauso ist es ja auch mit dem Client. ;-)
Die Execute-Routine ist nur die Hauptsteuerungsroutine für den Thread, der für die TCP-Verbindung zuständig ist. Es wird durch den Verbindungsaufbau ausgelöst, und nicht durch Datenempfang!
Wie gesagt, ich lagere die clientseitigen Empfangsroutinen in einen separaten Thread aus und brauche deshalb auch nicht AntiFreeze.

Cu,
Udontknow

blablab 18. Mai 2007 19:31

Re: Indy-Komponenten
 
Ob ich jetzt n ereignis bekomm wenn er ne verbindung macht oder was auch immer, auf jeden Fall bekomm ich beim Server n Ereignis, wenn ich daten bekomme und beim Client nicht... Und meiner Meinung nach sollte das entwedr bei beiden gehn oder bei keinem. Wobei das ja nur ein Problem ist, das mich stört.
Dann interpretier ich das mal so, dass du mit den Indy-Komponenten vollkommen zufrieden bist und dir bis jetzt auch noch keine Unschönheiten aufgefallen sind, die dich stören.

Vielleicht bin ich ja auch wirklich der einzigste hier, der was gegen solche Dinge wie AntiFreeze-Komponenten hat und den es nervt, wenn man eine Komponente ins Formular tut und gleichzeitig die exe um 100kb größer wird und man 3-4 neue namen in der uses-klausel stehen hat...

Meflin 18. Mai 2007 21:28

Re: Indy-Komponenten
 
Zitat:

Zitat von blablab
gleichzeitig die exe um 100kb größer wird

Wen stört das? Traffic ist billig...
Zitat:

und man 3-4 neue namen in der uses-klausel stehen hat...
Wenn dich DAS stört, dann öffne die Indy-Units (Source ist ja dabei) und kopiere den Quelltext in deine Haupt-Unit :roll:


blablab 19. Mai 2007 11:41

Re: Indy-Komponenten
 
@Meflin:
Ne, eigentlich störn mich die 100KB, die wahrscheinlich net alle notwendig sind und wegen den vielen Dateien in der Uses-Klausel zustandekommen. Und ich frag mich auch, wie die 100KB zustandekommen nur zb für nen TCP-Server...

Aber probiers mal aus den Code in dein Projekt zu kopiern. Das wird schwierig, derade deswegen, weil du die vielen Dateien in der Uses-Klausel hast und die einzelnen Dateien wieder viel in der Uses-Klausel stehn haben...
Ich wär sogar interessiert an einem solchen Programm bei dem der Quelltext eines idHttp bzw idTCPServer kopiert ist. Ich wollte nämlich mal mit dem Debugger gucken, wieso er fürn Get() mal 5s und mal 20s TimeOut braucht. Aber leider funktioniert der Debugger in den TCP-Komponenten net...

OG Karotte 19. Mai 2007 12:25

Re: Indy-Komponenten
 
Zitat:

Zitat von CCRDude
Ich benutze inzwischen Synapse...

Dem kann ich mich nur anschliessen, denn auch mir war das "Ergebnis" mit den Indy's "zu groß" und persönlich finde ich sie insbesondere seit der Version 10 sehr unübersichtlich (sowohl in der Komponentenpalette als auch der Quellcode selbst).

Im Gegenzug dazu empfinde ich Synapse deutlich handlicher mit recht gutem Support und einer übersichtlichen Dokumentation.

Allerdings bleibt es auch bei Synapse dabei, das man sich selbst um Empfang und Senden kümmern muss, will sagen auch hier wird kein Ereignis ausgelöst, wenn Daten empfangen werden...

... aber das ganze in einen "Endlos"-Thread gepackt und Prüfung ob Daten anliegen funzt wunderbar (und die eigene Anwendung wird auch nicht "blockiert").

blablab 19. Mai 2007 12:46

Re: Indy-Komponenten
 
@OG Karotte:
Das hört sich ja ganz interessant an. Werd mir das Synapse mal anschaun...

Eine Frage hätte ich noch, da dir der Platzverbrauch von den Indy's ja au nicht so gefällt.

Zitat:

Zitat von Meflin
Zitat:

Zitat von Blablab
gleichzeitig die exe um 100kb größer wird

Wen stört das? Traffic ist billig...

Was antwortet man auf sowas?

Udontknow 19. Mai 2007 12:48

Re: Indy-Komponenten
 
Zitat:

Zitat von blablab
Ob ich jetzt n ereignis bekomm wenn er ne verbindung macht oder was auch immer, auf jeden Fall bekomm ich beim Server n Ereignis, wenn ich daten bekomme und beim Client nicht...

:wall:
Arghhh... Zum dritten Mal: Das OnExecute-Event des TCPServers ist kein Datenempfangsevent! Der einzige Grund, warum beim Server es dieses Event gibt, und beim CLient nicht, ist, daß der Server mehrere Verbindungen auf einmal verwalten muss. Es ist einfach nur da, um dem Programmierer die Möglichkeit zu geben, Code in Abhängigkeit der Verbindung (Parameter AContext bzw. AThread) zu definieren, der dann ausgeführt werden muss. Innerhalb der Execute-Routine (also innerhalb des Verbindungsthreads) wird doch aber genauso "geblockt", wenn du ein Readln o.ä. aufrufst...

Bis dann,

Andreas

jmit 19. Mai 2007 12:53

Re: Indy-Komponenten
 
Hallo,

Zitat:

Zitat von OG Karotte
Zitat:

Zitat von CCRDude
Ich benutze inzwischen Synapse...

Dem kann ich mich nur anschliessen, denn auch mir war das "Ergebnis" mit den Indy's "zu groß" und persönlich finde ich sie insbesondere seit der Version 10 sehr unübersichtlich (sowohl in der Komponentenpalette als auch der Quellcode selbst).

Im Gegenzug dazu empfinde ich Synapse deutlich handlicher mit recht gutem Support und einer übersichtlichen Dokumentation.

Allerdings bleibt es auch bei Synapse dabei, das man sich selbst um Empfang und Senden kümmern muss, will sagen auch hier wird kein Ereignis ausgelöst, wenn Daten empfangen werden...

... aber das ganze in einen "Endlos"-Thread gepackt und Prüfung ob Daten anliegen funzt wunderbar (und die eigene Anwendung wird auch nicht "blockiert").

... und wo kann ich Synapse inkl. Dokumentation herunterladen.

Gruß Jörg

blablab 19. Mai 2007 13:07

Re: Indy-Komponenten
 
@Udontknow:
Tut mir leid wenn ich dich nerv...

Ok, lassen wir das. Ich glaub ich hab verstanden was du meinst.

OG Karotte 19. Mai 2007 13:16

Re: Indy-Komponenten
 
Zitat:

Zitat von jmit
... und wo kann ich Synapse inkl. Dokumentation herunterladen.

Guckst Du hier (die Website) oder hier als direkter Download (ca. 800 kb).

Und als ergänzende Info kann ich diese PDF empfehlen (Ist allerdings (immer noch) in einem sehr frühen Stadium :( ). Trotzdem kann man das eine oder andere dort nachschlagen / vertiefen.

@blablab:

Zitat:

Zitat von blablab
...Was antwortet man auf sowas?

Nichts, warum auch, denn es stimmt:
mal kostet der Traffic (ich nehme mal an es wird der Download gemeint) nichts (Fulltimeflat), mal ein wenig (Flatrate nach Traffic) und mal 'n bisschen mehr (Modem / ISDN (Na ja, es sei denn es ist eine SAT-Verbindung, dann sind es ca. 9 Euronen die Minute, aber das ist eher die Aussnahme)).

Aber bei den heutzutage üblichen Proggrössen fallen diese 100k auch nicht mehr so in's Gewicht...

Meflin 19. Mai 2007 14:09

Re: Indy-Komponenten
 
Zitat:

Zitat von blablab
Ne, eigentlich störn mich die 100KB, die wahrscheinlich net alle notwendig sind und wegen den vielen Dateien in der Uses-Klausel zustandekommen. Und ich frag mich auch, wie die 100KB zustandekommen nur zb für nen TCP-Server...

Wieso? Stört dich dann auch, dass eine leere (!) Delphi-Anwendung ~400kb (abhängig von der Delphi-Version) groß ist? Ist ja wohl auch net wirklich nötig oder. Aber ich bin mir sicher, da hast du dir auch nicht den Kopf darüber zerbrochen, weil es nunmal einfach so ist.

Zitat:

Aber probiers mal aus den Code in dein Projekt zu kopiern. Das wird schwierig, derade deswegen, weil du die vielen Dateien in der Uses-Klausel hast und die einzelnen Dateien wieder viel in der Uses-Klausel stehn haben...
Ich wüsste nicht wieso. Und ich wüsste auch keinen triftigen Grund, weswegen man seine Uses-Liste so klein wie möglich halten sollte und wieso deshalb die Indy-Units in den Uses stören :gruebel:

Zitat:

Ich wollte nämlich mal mit dem Debugger gucken, wieso er fürn Get() mal 5s und mal 20s TimeOut braucht. Aber leider funktioniert der Debugger in den TCP-Komponenten net...
Wieso sollte der Debugger da nicht gehen? Strg + Click auf IdTCPClient/Server Unit, Breakpoint setzen, fertig.



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