Entwickler-Ecke
Open Source Units - SimpleTCP (Indy-10-Wrapper) *** Version 1.0.1.3 ***
Udontknow - Do 25.08.05 15:13
Titel: SimpleTCP (Indy-10-Wrapper) *** Version 1.0.1.3 ***
Hallo allesamt,
lange hat´s gedauert, aber nun ist es soweit, die Portierung der TSimpleTCP-Komponenten auf Indy 10 ist geschafft.
Für eine Beschreibung der Komponenten klicke
hier [
http://www.delphi-forum.de/topic_SimpleTCP+IndyWrapper++Version+1005+_28579.html].
Im Anhang befindet sich die Unit sowie eine kleine (häßliche, aber funktionierende) Demo.
2006-03-01: Neue Version eingespielt, Quellcode als nun als Anhang.
Cu,
Udontknow
Udontknow - Mi 31.08.05 12:32
Hallo!
Die neueste Version behebt einige Probleme mit Zugriffsschutzverletzungen beim Schliessen von Anwendungen:
Wurde die Client- oder Serverkomponente in einer Anwendung nicht vor deren Beendigung geschlossen, sodaß der Destruktor der SimpleTCP-Komponenten die Verbindungen schliesst, kommt es u.U. zu Accessviolations, da die Events der Komponenten noch immer ausgelöst wurden. Wenn man im Event OnDisconnect beispielsweise in einem Memo das vermerkte, war dieses Memo (je nach Erstellungsreihenfolge in der DFM) möglicherweise schon nicht mehr existent.
Events werden nun nicht mehr ausgelöst, wenn die Komponente csDestroying im ComponentState enthält. Sollen also bei Beendigung des Programms unbedingt noch die Events ausgelöst werden, muss die entsprechende SimpleTCP-Komponente vorher "manuell" geschlossen werden (bspw. im FormClose etc.).
Cu,
Udontknow
Fettlaus - Do 29.09.05 00:53
Hi Udontknow,
Ich find deinen Wrapper echt klasse, zumal ich in Delphi noch nicht all zu bewandert bin. Leider kam ich noch nicht dazu, ihn zu benutzen:
Ich habe versucht, den Wrapper zu benutzen, aber bin prompt auf einen Fehler gestoßen.
Und zwar bekomme ich eine "Access Violation" beim setzen des Ports.
Das Programm habe ich erstmal noch nicht weiter entwickelt, aber hier der Quelltext bis jetzt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| unit UChat;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, SimpleTCP, StdCtrls, ComCtrls;
type TForm1 = class(TForm) ListView1: TListView; Edit1: TEdit; Button1: TButton; Label1: TLabel; Server: TSimpleTCPServer; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin if (StrToInt(Edit1.Text)<65535) or (StrToInt(Edit1.Text)>1024) then begin Server.Port:=StrToInt(Edit1.Text); Server.Active:=true; end else begin Showmessage('Du musst einen Port zwischen 1024 und 65535 angeben') end; end;
end. |
Und an genau dieser Stelle bleibt er hängen(Zeile 3):
Delphi-Quelltext
1: 2: 3: 4:
| procedure TSimpleTCPServer.SetPort(const Value: Integer); begin FServer.DefaultPort:=Value; end; |
Ich habe irgendwie die Befürchtung, das ist ein ganz blöder Anfängerfehler und ihr könnt mir schnell und schmerzlos helfen :(
Udontknow - Do 29.09.05 08:31
Hallo!
Das klingt sehr merkwürdig. Hast du die Unit auch in ein Package gesteckt und dieses installiert, sodaß du die Serverkomponente wie einen Button aus der Komponentenliste aufs Formular packen kannst? Oder hast du einfach nur die Unit in der uses-Klausel aufgenommen und die Variable Server von hand eingetragen?
Prüfe mal, ob die Serverkomponente auch wirklich erstellt wurde:
Delphi-Quelltext
1: 2:
| if Server=NIL then showMessage('Diese Variable ist nicht initialisiert!'); |
Cu,
Udontknow
Fettlaus - Do 29.09.05 10:10
Ich sag ja, wird sicher ein Anfängerfehler sein...
Vielen Dank für die schnelle Hilfe, klappt alles einwandfrei bisher.
jakobwenzel - Di 15.11.05 19:27
Bei der alten Version war es so, dass Active als Eigenschaft im Objektinspektor definiert war, jetzt gibt es sie dort nicht mehr. Warum? :?
Passi077 - Do 26.01.06 18:54
Hi,
ich hab ein Problem beim installieren.. und zwar hat findet er die folgenden Komponenten nicht? :
uses Classes, Windows, SysUtils, SyncObjs, idGlobal, idContext, IdTCPClient,
IdTCPServer, IdSchedulerOfThread, IdStreamVCL, idIOHandler, Dialogs;
WIe kann ich das behen?
Danke + Grüße
Passi
Udontknow - Do 26.01.06 19:15
Hast du Indy 10 denn installiert? By D7 ist noch das alte Indy dabei...
Cu,
Udontknow
Passi077 - Do 26.01.06 19:58
Oha, kein Wunder Oo
Aber es funktioniert leider trotzdem nicht, beim Kompilieren erkennt er jetzt "TIDStreamVCL" nicht (undefinierter Bezeichner..)
?
Udontknow - Do 26.01.06 20:20
Hast du einen entsprechenden Bibliothekspfad in den Optionen angegeben, der zu den PAS-Dateien von Indy führt?
Cu,
Udontknow
Xantor - Fr 24.02.06 12:33
Ich arbeite noch mit der alten Komponente - hab aber damit ein Problem. Und zwar sende ich 25 mal pro Sekunde ein kleines Datenpacket(6 Bytes) vom Server an die Clients, diese aber erhalten nicht 25 einzelne Nachrichten, sondern nur rund 5 mal pro Sekunde einen packen aus 5 Nachrichten. Das ist aber nicht das, was ich brauche. Habe auch schon die Priorität des Client-Threads hoch gesetzt, aber das bringt nichts.
Frage: Könnte das mit der dieser neuen Version besser klappen?
Udontknow - Fr 24.02.06 18:30
Öh, bei den alten war nichts wesentlich anders, da wurde auch schon immer ein Receive-Ereignis pro Sendung ausgelöst...
Bist du sicher, daß du die SimpleTCP-Komponenten von mir genutzt hast?
Cu,
Udontknow
Xantor - Fr 24.02.06 20:01
Da bin ich mir ganz sicher :)
Aber so wie du schreibst, gehe ich davon aus, das du selber irritiert bist - also mir kommt das ja auch komisch vor. Ich werde noch mal genauer nach der Ursache forschen. Bei der Gelegenheit hab ich noch eine Frage: Wie groß glaubst du ist die Lantenz-Zeit zwischen absenden der Message vom Server und des eintreffens bzw. auslösen des Ereignises beim Client. Natürlich keine Last - also Idealzustand. Genau brauch ich es nicht, aber wenn es viel größer als 10ms ist, dann muß ich mir sowieso was anderes überlegen, da ich die Rechner synchronisieren will.
Udontknow - So 26.02.06 15:23
Tja, also die Komponente basiert nunmal auf TCP, und TCP ist nicht dafür bekannt, eine gute Latenz zu erreichen. Ich habe das ganze mal mit einem "Ping" versehen, es waren so um die 300 ms, die in einem lokalen(!) Netz auftauchen können.
Das ganze müsste dann über UDP konzipiert werden, aber da hast du dann auch wieder Nachteile (begrenzte Grösse der Datenmenge, keine Sicherheit, daß Pakete ankommen, etc.).
Cu,
Udontknow
Udontknow - Mi 01.03.06 10:27
Titel: Neue Version 1.0.1.3
Hallo allesamt,
habe die Unit nun als Anhang im ersten Post eingefügt, es ist ausserdem noch ein Fehler behoben worden, der bei Verbindungsabbrüchen auf Clientseite dazu führen konnte, daß der Client weder die Verbindung ordentlich lösen noch neu herstellen konnte ('Connection reset by peer').
Bis dann,
Andreas
Xantor - Mi 01.03.06 14:57
Danke für deine Bemühungen - ich werde aber erst nächste Woche dazu kommen das auszuprobieren. Außerdem werd ich mal die 2 UDP-Komponenten von Indy testen, ob sie auch dieses (für mich) merkwürdige Verhalten zeigen. Als "Ass im Ärmel" hab ich dann immer noch MIDI. Das hat ein sehr gutes Latenzverhalten - garantiert unter 10ms für die paar Byte die ich da versende. Möglicherweise gibts für das ganze Problem ja auch eine völlig andere Erklärung und ich hab sie nur noch nicht gefunden.
redjustice - Sa 19.08.06 12:38
Hey udontknow!
Wollte mich bei dir kräftig bedanken!
Deine Indy-Wrapper haben mich sehr viel weitergebracht.
Kurz nebenbei:
Kann ich irgendwie einen Datentransfer abbrechen?
Wird es eigentlich auch irgendwann ein SimpleUDP für Indy 10 geben?
MfG red
Udontknow - Di 22.08.06 17:50
Hallo!
Zitat: |
Wollte mich bei dir kräftig bedanken!
Deine Indy-Wrapper haben mich sehr viel weitergebracht. |
Das höre ich gerne!
Zitat: |
Kann ich irgendwie einen Datentransfer abbrechen? |
Nein. Um den Datentransfer abzubrechen, müsste ich noch stark aufbohren, es müssten zwischendurch immer wieder Steuer-Informationen gesendet und interpretiert werden. Da ich aber aufgrund eines Jobs, der mich sehr auslastet, kaum die Zeit finde, wird das nix...
Zitat: |
Wird es eigentlich auch irgendwann ein SimpleUDP für Indy 10 geben? |
Auch hier leider nein, keine Zeit. Ich hatte mal so etwas gemacht für Indy 9, aber es hat nie so richtig gut geklappt, und irgendwie habe ich es nie für Indy 10 ans Laufen gekriegt.
Cu,
Udontknow
oern - Di 10.10.06 19:20
Eine wunderschöne TCP Komponente :D Funktioniert einwandfrei :)
Was nur etwas störent ist ist die Exception "Disconnected." Beim Beenden des Servers die würde ich gerne beseitigen.
Ansonsten tolle arbeit, danke für die Unit :D
mfg, Björn
matze - Mi 25.04.07 10:17
Ich habe auch da Problem, dass die Klasse TIDStreamVCL bei mir nicht gefunden werden kann. Ich habe alle Suchpfade korrekt eingestellt, aber nichts.
Ich habe auch ein bisschen im Internet recherchiert und das gefunden:
http://www.marcocantu.com/md2005/UpdateDelphi2006_ch19.html
Kann es sein, dass die TIDStreamVCL Klasse nicht mehr unterstützt wird?
Udontknow - Do 26.04.07 10:41
Lang ist´s her, aber ich meine mich erinnern zu können, daß die tatsächlich von 9 auf 10 herausgenommen wurden. also ab jetzt immer direkt mit TStream-Nachfahren arbeiten:
Delphi-Quelltext
1: 2:
| IOHandler.ReadStream(Stream,ByteCount); IOHandler.Write(Stream,ByteCount); |
Cu,
Udontknow
matze - Do 26.04.07 13:32
Das bedeutet also, dass ich in deiner SimpleTCP Komponente alle TidVCLStream durch einen normalen TStream ersetzten muss.
Hab ich das jetzt richtig verstanden.
Passt du deine Komponente auch noch an, oder soll das jeder selber machen?
Udontknow - Do 26.04.07 16:57
matze - Do 26.04.07 17:03
aber sonst ist die Handhabung noch genau, wie bei der Version für die Indy 9, oder?
PS: Sorry, wenn ich nerve, aber kannst du bitte auch noch deine Anhänge im ersten Post aktualisieren?
Udontknow - Do 26.04.07 17:27
Ja, die Handhabung sollte die gleiche sein.
Habe jetzt die neuere Version hinzugefügt, die alte lasse ich aber besser da auch noch stehen...
Cu,
Udontknow
DeltaEx - Do 11.10.07 14:00
Erstmal Super Komponente!
Meine Frage ist, wie kann ich einen Fortschrittsbalken bei der Übertragung machen?
Und wie kriege ich den Disconnect Fehler beim beenden des Servers weg?
Achja und wie kann ich mehrere Client in der Methode ServerInput auf dem Server unterscheiden? Heißt von welchem Client wurde was zum Server geschickt?
Danke im Voraus.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!