12.09.2021 (Version 3.1)
25.05.2021 (Version 3.0)
13.03.2021 (Version 2.6)
01.02.2021 (Version 2.5)
18.12.2020 (Version 2.4)
28.11.2020
31.10.2020 (Version 2.3)
27.10.2020 (Version 2.2)
26.10.2020 (Version 2.1)
09.10.2020
06.10.2020
24.09.2020
16.07.2020
12.07.2020
03.05.2020
19.04.2020
31.03.2019
Mit diesen Komponenten können Sie eine asynchrone TCP-Socket-Kommunikation zwischen Computern im LAN-Netzwerk oder im Internet einrichten.
Der DzTCPServer und der DzTCPClient verwenden TClientSocket und TServerSocket der System.Win.ScktComp-Einheit. Diese Klassen sind in Delphi verfügbar, aber etwas schwierig zu implementieren, da Sie Pufferdaten lesen und schreiben müssen und nicht viele Ressourcen verfügbar sind.
Die Verwendung ist sehr einfach. Sie müssen die Serverkomponente in der serverseitigen App und die Clientkomponente in der clientseitigen App löschen und mit der Codierung der Befehlsnachrichten beginnen.
Sie können viele Dinge tun, wie eine Chat-App, eine Remote-Befehls-App, eine Remote-Überwachungs-App und sogar Streams wie Dateien senden. Der Himmel ist die Grenze.
Cache-Struktur : Wenn Sie die native Socket-Komponente von Delphi verwenden und mehrere Nachrichten gleichzeitig senden, erhält der Empfänger die Nachrichten möglicherweise gruppiert oder aufgeteilt, sodass Sie sich immer mit diesem Problem befassen müssen. DzSocket steuert Socket-Nachrichten automatisch, sodass Sie immer ein Ereignis pro Nachricht erhalten.
KeepAlive : Wenn Sie eine Socket-Verbindung herstellen und eine Seite der Verbindung verloren geht, wird die andere Seite nicht kommuniziert, bis eine neue Nachricht gesendet werden soll. Sie können also einen manuellen Ping implementieren, aber das macht viel unnötige Arbeit. DzSocket verfügt über die KeepAlive-Ressource, die das netzwerknative Keep-Alive-Protokoll ermöglicht.
Befehle : Mit dem nativen Socket können Sie Zeichenfolgensegmente senden. Wenn Sie jedoch Befehle senden und diese Befehle auf der anderen Seite der Verbindung identifizieren möchten, müssen Sie dies manuell implementieren. Mit DzSocket steht Ihnen immer ein Char-Befehl zur Verfügung. Fertig, schnell und einfach.
Automatisch freie Datenobjekte auf dem Server : Die auf der Serverkomponente verfügbare Clientobjektliste verfügt über eine Pointer-Eigenschaft, mit der Sie Informationen über die Clientverbindung speichern können, normalerweise mithilfe eines Objekts. Mit DzSocket müssen Sie sich über die Zerstörung dieser Objekte keine Sorgen machen. Sie müssen lediglich einer Eigenschaft ermöglichen, sich um diese Objekte zu kümmern.
Enumerator : Die native Serverkomponente verfügt nicht über einen Enumerator zum Durchlaufen von Clientlistenverbindungen. Mit DzSocket können Sie einfach ein for .. in
direkt auf der Serverkomponente ausführen und Clientlistenverbindungen iterieren.
SendAll : Einfaches Senden von Befehlen an alle Clients. Darüber hinaus können Sie SendAllEx
verwenden, um Befehle an alle Clients außer einer bestimmten Clientverbindung zu senden.
Verbindungsmonitor : Es gibt ein Ereignis „Verbindung verloren“, das Ihnen zeigt, wann die Verbindung ohne Client-Anfrage geschlossen wurde.
Unicode-Unterstützung : Die native Delphi-Komponente unterstützt das Senden von Nachrichten mit Unicode-Zeichenfolgen nicht, es sei denn, Sie schreiben Ihren eigenen Code, um den Datenstrom auf beiden Seiten zu konvertieren. Das ist wirklich langweilig und braucht Zeit. Mit DzSocket können Sie einfach Nachrichtentext senden, indem Sie direkt den Methodenparameter als String-Typ verwenden, sodass Delphi Unicode-Zeichen standardmäßig als WideString betrachtet.
Anmeldekontrolle : Sie können die Authentifizierung/Autorisierung des Clients mithilfe einfacher Ereignisse steuern und zusätzliche Dateninformationen senden, um den Clientzugriff auf den Server zu steuern.
Automatische Wiederverbindung : Die Client-Komponente kann sich automatisch wieder mit dem Server verbinden, wenn die Verbindung unterbrochen wird, indem einfach eine Eigenschaft aktiviert wird.
Und noch viel mehr!
Unterstützt Delphi XE3..Delphi 11
AutoFreeObjs: Boolean
(public) = Wenn Sie Data
Eigenschaft von Client-Sockets auf dem Server zum Zuweisen von Objekten verwenden, können Sie diese Option aktivieren, damit die Komponente die Objektzerstörung übernimmt, wenn der Client-Socket endet. Denken Sie daran: Wenn diese Option aktiviert und die Data-Eigenschaft des Sockets zugewiesen ist, geht die Komponente immer von Data als Objekt aus.
EnumeratorOnlyAuth: Boolean
(public) = Wenn Sie den Komponentenenumerator for in
verwenden, werden noch nicht authentifizierte Clients umgangen.
KeepAlive: Boolean
= Aktivieren der nativen KeepAlive-Socket-Ressource zulassen. Dadurch wird mithilfe der KeepAliveInterval-Eigenschaft ein Keep-Alive-Signal gesendet.
KeepAliveInterval: Integer
= Gibt das KeepAlive-Intervall in Millisekunden an (Standard 15000 / 15 Sekunden ).
Port: Word
= Gibt den Server-Listen-TCP-Port an. Diese Eigenschaft ist erforderlich, um den Server-Socket zu starten.
Connection[Index: Integer]: T DzSocket
(public) = Gibt das T DzSocket Client-Verbindungsobjekt nach Index zurück.
Count: Integer
(öffentlich) = Gibt die Anzahl der Client-Verbindungslisten zurück.
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
Dieses Ereignis wird ausgelöst, wenn ein Client eine Verbindung zum Server herstellt. Der Socket
-Parameter ist der Client-Socket.
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
Dieses Ereignis wird ausgelöst, wenn ein Client die Verbindung zum Server trennt. Der Socket
-Parameter ist der Client-Socket.
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Dieses Ereignis wird ausgelöst, wenn bei einer Clientverbindung ein Fehler auftritt. Der Socket
-Parameter ist der Client-Socket.
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Dieses Ereignis wird ausgelöst, wenn ein Client eine Nachricht an den Server sendet. Der Socket
-Parameter ist der Client-Socket.
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
Dieses Ereignis wird ausgelöst, wenn sich ein Client gerade mit dem Server verbunden hat. Wenn auf der Client-Seite der OnLoginRequest
verarbeitet wird, werden die gesendeten Dateninformationen hier in den RequestData
-Parameter übertragen. Sie können den Parameter Accept
“ (der anfängliche Standardwert ist „True“) ändern, um die Clientverbindung zu akzeptieren oder abzulehnen. Darüber hinaus können Sie den ResponseData
-Parameter verwenden, um einige Dateninformationen an den Client zu senden. Das akzeptierte Flag und die Dateninformationen werden vom Client beim OnLoginResponse
Ereignis empfangen. Wenn der Accept
Parameter True bleibt, wird die Socket- Auth
-Eigenschaft auf True gesetzt. Andernfalls wird die Client-Verbindung vom Server unterbrochen.
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
Dieses Ereignis wird unmittelbar nach der Autorisierung eines Clients beim Server ausgelöst. Auch wenn Sie keine Anmeldeereignisse verwenden, denken Sie daran: Erst nachdem der Client beim Server autorisiert wurde, kann der Client Nachrichten senden. Andernfalls ignoriert der Server alle Clientnachrichten.
procedure Open ;
Schalten Sie den Server-Listening-Socket-Port ein.
procedure Close ;
Schalten Sie den Server-Listening-Socket-Port aus.
procedure Lock ;
procedure Unlock ;
Verwenden Sie diese Methoden, um die Verbindungsliste zu iterieren (threadsicher), da eine Verbindung möglicherweise geschlossen wird, wenn Sie die Verbindungsliste iterieren.
Beispiel:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
Außerdem verfügt die TDzTCPServer-Komponente über einen Standard-Enumerator, der auf die Verbindungsliste verweist, was zu einem T DzSocket -Objekt führt. Sie können die Verbindungsliste also wie im vorherigen Beispiel mit einer
for .. in
-Anweisung iterieren.
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Sendet Befehle und Nachrichten an einen Client-Socket, der durch Socket
-Parameter angegeben wird. Sie sollten Cmd
Parameter verwenden, um ein Befehlszeichen anzugeben, das vom Client empfangen wird. Der Parameter A
ist optional und ermöglicht die Angabe eines Nachrichtentextes.
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
Senden Sie eine Nachricht an alle authentifizierten Clients.
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Senden Sie eine Nachricht an alle authentifizierten Clients, außer an den Client, der durch Exclude
-Parameter angegeben wird.
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
Gibt das T- DzSocket Objekt nach Socket-Handle-ID zurück.
function GetAuthConnections : Integer;
Ruft nur die Anzahl der authentifizierten Verbindungen ab.
AutoReconnect: Boolean
= Wenn aktiviert, versucht der Socket, die Verbindung automatisch wiederherzustellen, wenn der Client die Verbindung zum Server verliert.
AutoReconnectInterval: Integer
= Gibt die Zeit in Millisekunden an, die auf einen neuen Verbindungsversuch gewartet wird (Standard 10000 / 10 Sekunden ).
AutoReconnectAttempts: Integer
= Wie oft wird versucht, die Verbindung wiederherzustellen, nachdem die Verbindung verloren gegangen ist? Lassen Sie den Wert 0
um es unendlich oft zu versuchen.
KeepAlive: Boolean
= Aktivieren Sie die native KeepAlive-Socket-Ressource. Dadurch wird mithilfe der KeepAliveInterval-Eigenschaft ein Keep-Alive-Signal gesendet.
KeepAliveInterval: Integer
= Gibt das KeepAlive-Intervall in Millisekunden an (Standard 15000 / 15 Sekunden ).
Host: String
= Gibt die IP oder den Hostnamen (DNS) für die Verbindung zum Server an. Diese Eigenschaft ist erforderlich, um eine Verbindung zum Server-Socket herzustellen.
Port: Word
= Gibt den TCP-Port der Client-Verbindung an, den der Server überwacht oder dem der Port zugeordnet ist. Diese Eigenschaft ist erforderlich, um eine Verbindung zum Server-Socket herzustellen.
Connected: Boolean
(öffentlich) = Gibt „true“ zurück, wenn die Verbindung hergestellt ist.
SocketHandle: TSocket
(public) = Gibt die Socket-Handle-ID der Verbindung zurück.
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
Dieses Ereignis wird ausgelöst, wenn der Client die Verbindung zum Server herstellt.
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
Dieses Ereignis wird ausgelöst, wenn die Verbindung zwischen Client und Server unterbrochen wird. Dies geschieht, wenn der Client erkennt, dass die Verbindung ohne einen Trennbefehl vom Client selbst geschlossen wurde.
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
Dieses Ereignis wird ausgelöst, wenn der Client die Verbindung zum Server trennt, auch wenn die Verbindung unterbrochen wird. Mit WasConnected
können Sie feststellen, ob das OnDisconnect-Ereignis von einer bestehenden Verbindung stammt, da dieses Ereignis auch dann ausgelöst wird, wenn Sie versuchen, eine Verbindung herzustellen, die Verbindung jedoch nicht erfolgreich hergestellt werden konnte.
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Dieses Ereignis wird ausgelöst, wenn bei der Clientverbindung ein Fehler auftritt. Es wird immer empfohlen, dieses Ereignis festzulegen, da die Komponente sonst unkontrollierte asynchrone Fehler auslöst.
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Dieses Ereignis wird ausgelöst, wenn der Client eine Nachricht vom Server erhält.
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
Dieses Ereignis wird unmittelbar nach der Verbindung des Clients mit dem Server ausgelöst. Dies bedeutet, dass der Server Anmeldedaten anfordert, sodass er diese Daten überprüfen und die Client-Verbindung akzeptieren oder trennen kann. Sie sollten Data
ausfüllen, wenn Sie diese Informationen auf dem Server verarbeiten möchten.
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
Dieses Ereignis wird ausgelöst, wenn der Server die Clientverbindung akzeptiert oder ablehnt. Sie können dieses Ergebnis im Parameter Accepted
überprüfen, und der Server sendet möglicherweise einige Dateninformationen an den Client im Parameter Data
.
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
Tritt auf, wenn AutoReconnect
Eigenschaft aktiviert ist und eine Verbindung nach den AutoReconnectInterval
Millisekunden unterbrochen wird. Schlägt der erneute Verbindungsversuch fehl, wird das Ereignis sukzessive ausgelöst, bis eine Verbindung hergestellt wird. Sie können die Wiederverbindungsversuche abbrechen, indem Sie die Eigenschaft Cancel
im Wiederverbindungsereignis auf True
ändern oder die Methode StopReconnection
aufrufen.
procedure Connect ;
Verbindet sich mit dem Server.
procedure Disconnect ;
Trennt die Verbindung zum Server.
procedure StopReconnection ;
Stoppt erneute Verbindungsversuche, wenn AutoReconnect
aktiviert ist und eine Verbindung unterbrochen wird.
procedure Send ( const Cmd: Char; const A: String = ' ' );
Sendet Befehle und Nachrichten an den Server. Sie sollten Cmd
Parameter verwenden, um ein Befehlszeichen anzugeben, das vom Server empfangen wird. Der Parameter A
ist optional und ermöglicht die Angabe eines Nachrichtentextes.
Wichtig: Der Server empfängt keine Nachrichten, solange der Client noch nicht authentifiziert ist, selbst wenn er bereits verbunden ist.
Nur verfügbar auf Delphi XE6 oder höher
Wenn Sie die Send
vom Server- oder Client-Socket verwenden, gibt es einen String
Parameter, der Ihnen das Senden von Daten ermöglicht. Es gibt zwei globale Methoden, mit denen Sie mehrere Daten gleichzeitig senden können:
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
Absender:
var
I: Integer;
S: String;
begin
I := 123 ;
S := ' Test ' ;
DzTCPClientTest.Send( ' M ' , ArrayToData([I, S]));
end ;
Empfänger:
procedure DzTCPServerTestClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
var MsgArray: TMsgArray;
begin
MsgArray := DataToArray(A);
ShowMessage(Format( ' Number = %d / String = %s ' , [MsgArray[ 0 ], MsgArray[ 1 ]]));
end ;
Die Konvertierungsfunktionen verwenden intern JSON, um sicherzustellen, dass Teile von Zeichen maskiert werden, um sicherzustellen, dass Arrays ohne Änderung des Inhalts gepackt/entpackt werden. Sie müssen sich also keine Gedanken über den Inhalt von Variantentypteilen machen.
Bitte schauen Sie sich die Demoanwendung an und sehen Sie sich den Befehl „Druck senden“ an, um zu erfahren, wie Sie Datenströme senden und empfangen und wie Sie auch die Komprimierung verwenden, um die Kommunikationsgeschwindigkeit zu erhöhen.