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)
10/09/2020
10/06/2020
24/09/2020
16/07/2020
07/12/2020
05/03/2020
19/04/2020
31/03/2019
Ces composants vous permettent d'établir une communication asynchrone TCP Socket entre des ordinateurs sur un réseau LAN ou sur Internet.
DzTCPServer et DzTCPClient utilisent TClientSocket et TServerSocket de l'unité System.Win.ScktComp. Ces classes sont disponibles sur Delphi, mais elles sont un peu difficiles à implémenter car vous devez lire et écrire des données de tampon et il n'y a pas beaucoup de ressources disponibles.
L'utilisation est très simple. Vous devrez déposer le composant serveur sur l'application côté serveur et le composant client sur l'application côté client et commencer à coder les messages de commande.
Vous pouvez faire beaucoup de choses, comme une application de chat, une application de commandes à distance, une application de surveillance à distance et même envoyer des flux comme des fichiers. Le ciel est la limite.
Structure du cache : lorsque vous utilisez le composant socket natif Delphi, si vous envoyez plusieurs messages simultanément, le destinataire peut recevoir les messages regroupés ou divisés, vous devez donc toujours gérer ce problème. DzSocket contrôle automatiquement les messages de socket, vous recevez donc toujours un événement par message.
KeepAlive : Lorsque vous établissez une connexion socket, si un côté de la connexion est perdu, l'autre côté ne sera pas communiqué jusqu'à ce qu'un nouveau message tente d'être envoyé. Vous pouvez donc implémenter un ping manuel, mais cela entraînera beaucoup de travail inutile. DzSocket dispose de la ressource KeepAlive, permettant le protocole keep-alive natif du réseau.
Commandes : Le socket natif vous permet d'envoyer un segment de chaîne, mais si vous souhaitez envoyer des commandes et identifier ces commandes de l'autre côté de la connexion, vous devrez l'implémenter manuellement. Avec DzSocket , vous disposez d'une commande Char toujours disponible. Prêt, rapide et facile.
Objets de données libérés automatiquement sur le serveur : la liste d'objets client disponible sur le composant serveur possède une propriété Pointer, vous permettant de stocker des informations sur la connexion client, généralement à l'aide d'un objet. Avec DzSocket , vous n'avez pas à vous soucier de la destruction de cet objet. Il vous suffit d'activer une propriété pour prendre en charge ces objets.
Énumérateur : le composant serveur natif n'a pas d'énumérateur pour itérer les connexions de la liste des clients. En utilisant DzSocket , vous pouvez simplement faire un for .. in
directement sur le composant Server, en itérant les connexions de la liste de clients.
SendAll : Envoyez facilement une commande à tous les clients. En plus de cela, vous pouvez utiliser SendAllEx
pour envoyer une commande à tous les clients, à l'exception d'une connexion client spécifique.
Moniteur de connexion : Il existe un événement Connexion perdue permettant de savoir quand la connexion a été fermée sans la demande du client.
Prise en charge Unicode : le composant natif Delphi ne prend pas en charge l'envoi de messages à l'aide de chaînes Unicode, sauf si vous écrivez votre propre code pour convertir le flux de données des deux côtés. C'est vraiment ennuyeux et prend du temps. En utilisant DzSocket vous pouvez simplement envoyer le texte du message en utilisant directement le paramètre de méthode comme type de chaîne, donc Delphi considérera les caractères Unicode comme WideString par défaut.
Contrôle de connexion : vous pouvez contrôler l'authentification/autorisation du client à l'aide d'événements simples et vous pouvez envoyer des informations de données supplémentaires pour contrôler l'accès du client au serveur.
Reconnexion automatique : Le composant client peut se reconnecter automatiquement au serveur lorsque la connexion est perdue, simplement en activant une propriété.
Et bien plus encore !
Prend en charge Delphi XE3..Delphi 11
AutoFreeObjs: Boolean
(public) = Si vous utilisez la propriété Data
des sockets client sur le serveur pour attribuer des objets, vous pouvez activer cette option afin que le composant se charge de la destruction des objets à la fin du socket client. N'oubliez pas que si cette option est activée et que la propriété Data du socket est affectée, le composant considérera toujours Data comme objet.
EnumeratorOnlyAuth: Boolean
(public) = Lors de l'utilisation de l'énumérateur de composants for in
, contournez les clients non encore authentifiés.
KeepAlive: Boolean
= Autoriser l'activation de la ressource native du socket KeepAlive. Cela enverra un signal keep-alive en utilisant la propriété KeepAliveInterval.
KeepAliveInterval: Integer
= Spécifie l'intervalle KeepAlive en millisecondes (par défaut 15 000/15 secondes ).
Port: Word
= Spécifie le port TCP d'écoute du serveur. Cette propriété est requise pour démarrer le socket du serveur.
Connection[Index: Integer]: T DzSocket
(public) = Renvoie l'objet de connexion client T DzSocket par Index.
Count: Integer
(public) = Renvoie le nombre de connexions client dans la liste.
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
Cet événement est déclenché lorsqu'un client se connecte au serveur. Le paramètre Socket
est le socket client.
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
Cet événement est déclenché lorsqu'un client se déconnecte du serveur. Le paramètre Socket
est le socket client.
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Cet événement est déclenché lorsque survient une erreur sur une connexion client. Le paramètre Socket
est le socket client.
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Cet événement est déclenché lorsqu'un client envoie un message au serveur. Le paramètre Socket
est le socket client.
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
Cet événement est déclenché lorsqu'un client vient de se connecter au serveur. Si côté client, OnLoginRequest
est géré, les informations de données envoyées seront ici reçues dans le paramètre RequestData
. Vous pouvez modifier le paramètre Accept
(la valeur par défaut initiale est True) pour accepter ou rejeter la connexion client. En plus de cela, vous pouvez utiliser le paramètre ResponseData
pour envoyer au client des informations sur les données. L'indicateur accepté et les informations sur les données seront reçus par le client lors de l'événement OnLoginResponse
. Si le paramètre Accept
reste True, alors la propriété socket Auth
sera définie sur True. Sinon, la connexion client sera interrompue par le serveur.
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
Cet événement est déclenché juste après qu'un client est autorisé à accéder au serveur. Même si vous n'utilisez pas d'événements de connexion, n'oubliez pas : ce n'est qu'une fois que le client est autorisé à accéder au serveur qu'il peut envoyer des messages. Sinon, le serveur ignorera tous les messages clients.
procedure Open ;
Activez le port de socket d'écoute du serveur.
procedure Close ;
Désactivez le port de socket d'écoute du serveur.
procedure Lock ;
procedure Unlock ;
Utilisez ces méthodes pour parcourir la liste des connexions (thread-safe), car une connexion peut être fermée lorsque vous parcourez la liste des connexions.
Exemple:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
De plus, le composant TDzTCPServer possède un énumérateur par défaut pointant vers la liste des connexions, ce qui génère un objet T DzSocket . Vous pouvez donc parcourir la liste de connexions en utilisant une instruction
for .. in
, tout comme l'exemple précédent.
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Envoie des commandes et des messages à un socket client spécifié par le paramètre Socket
. Vous devez utiliser le paramètre Cmd
pour spécifier un caractère de commande qui sera reçu par le client. Le paramètre A
est facultatif et permet de spécifier un texte de message.
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
Envoyez un message à tous les clients authentifiés.
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Envoie un message à tous les clients authentifiés, à l'exception du client spécifié par le paramètre Exclude
.
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
Renvoie l'objet T DzSocket par Socket Handle ID.
function GetAuthConnections : Integer;
Récupère uniquement le nombre de connexions authentifiées.
AutoReconnect: Boolean
= Si activé, lorsque le client perd la connexion au serveur, le socket tentera de se reconnecter automatiquement.
AutoReconnectInterval: Integer
= Spécifie le temps d'attente en millisecondes pour une nouvelle tentative de reconnexion (par défaut 10 000 / 10 secondes ).
AutoReconnectAttempts: Integer
= Combien de fois peut-on essayer de se reconnecter après une perte de connexion. Laissez la valeur 0
pour réessayer indéfiniment.
KeepAlive: Boolean
= Autoriser l'activation de la ressource native du socket KeepAlive. Cela enverra un signal keep-alive en utilisant la propriété KeepAliveInterval.
KeepAliveInterval: Integer
= Spécifie l'intervalle KeepAlive en millisecondes (par défaut 15 000/15 secondes ).
Host: String
= Spécifie l'adresse IP ou le nom d'hôte (DNS) pour se connecter au serveur. Cette propriété est requise pour se connecter au socket du serveur.
Port: Word
= Spécifie le port TCP de la connexion client, que le serveur écoute ou que le port est mappé. Cette propriété est requise pour se connecter au socket du serveur.
Connected: Boolean
(public) = Renvoie vrai si la connexion est établie.
SocketHandle: TSocket
(public) = Renvoie l'ID de handle de socket de la connexion.
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
Cet événement est déclenché lorsque le client établit la connexion au serveur.
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
Cet événement est déclenché lorsque la connexion est perdue entre le client et le serveur. Cela se produira si le client détecte que la connexion a été fermée sans commande de déconnexion de la part du client lui-même.
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
Cet événement est déclenché lorsque le client se déconnecte du serveur, même si la connexion est perdue. WasConnected
vous permet de savoir si l'événement OnDisconnect provient d'une connexion établie, car cet événement sera déclenché même si vous essayez de vous connecter et que la connexion n'est pas établie avec succès.
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Cet événement est déclenché lorsque survient une erreur sur la connexion client. Il est toujours recommandé de définir cet événement, sinon le composant générera des erreurs asynchrones incontrôlées.
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Cet événement est déclenché lorsque le client reçoit un message du serveur.
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
Cet événement est déclenché juste après la connexion du client au serveur. Cela signifie que le serveur demande des informations sur les données de connexion, afin qu'il puisse vérifier ces données et choisir d'accepter ou d'abandonner la connexion client. Vous devez remplir le paramètre Data
si vous souhaitez gérer ces informations sur le serveur.
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
Cet événement est déclenché lorsque le serveur accepte ou rejette la connexion client. Vous pouvez vérifier ce résultat dans le paramètre Accepted
et le serveur peut envoyer au client des informations de données dans le paramètre Data
.
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
Se produit lorsque la propriété AutoReconnect
est activée et qu’une connexion est perdue, après les millisecondes AutoReconnectInterval
. Si la tentative de reconnexion échoue, l'événement sera déclenché successivement jusqu'à ce qu'une connexion soit établie. Vous pouvez annuler les tentatives de reconnexion en modifiant la propriété Cancel
sur True
lors de l'événement de reconnexion ou en appelant la méthode StopReconnection
.
procedure Connect ;
Se connecte au serveur.
procedure Disconnect ;
Se déconnecte du serveur.
procedure StopReconnection ;
Arrête les tentatives de reconnexion lorsque AutoReconnect
est activée et qu'une connexion est perdue.
procedure Send ( const Cmd: Char; const A: String = ' ' );
Envoie des commandes et des messages au serveur. Vous devez utiliser le paramètre Cmd
pour spécifier un caractère de commande qui sera reçu par le serveur. Le paramètre A
est facultatif et permet de spécifier un texte de message.
Important : Le serveur ne recevra pas de messages tant que le client n'est toujours pas authentifié, même s'il est déjà connecté.
Uniquement disponible sur Delphi XE6 ou supérieur
Lorsque vous utilisez la méthode Send
depuis le serveur ou le socket client, il existe un paramètre String
vous permettant d'envoyer des données. Il existe deux méthodes globales que vous pouvez utiliser pour envoyer plusieurs données en même temps :
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
Expéditeur:
var
I: Integer;
S: String;
begin
I := 123 ;
S := ' Test ' ;
DzTCPClientTest.Send( ' M ' , ArrayToData([I, S]));
end ;
Récepteur:
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 ;
Les fonctions de conversion utilisent JSON en interne pour garantir que les caractères des pièces s'échappent afin de garantir le compactage/décompression des tableaux sans modification du contenu. Vous n’avez donc pas à vous soucier du contenu des pièces de type variante.
Veuillez consulter l'application de démonstration et consulter la commande Envoyer impression pour savoir comment envoyer et recevoir un flux de données, ainsi que comment utiliser la compression pour augmenter la vitesse de communication.