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
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if (StrToInt(Edit1.Text)<65535or (StrToInt(Edit1.Text)>1024then 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.


Narses - Mi 01.03.06 15:13

Moin!

Wenn du so knallhart am Puls-des-Netzes sein willst :wink:, dann darfst du eh keine asynchrone Benachrichtigung verwenden, sondern solltest blocking-socket-calls machen und mit einem Listener-Thread arbeiten!

Falls du nicht auf die Indies angewiesen bist/sein möchtest, gibt´s hier noch eine Alternative [http://www.delphi-forum.de/topic_TUdpSockUtil+V100++Alternative+zum+IndyUDPClientServer_55339.html]. :wink:

cu
Narses


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.