Surveillance et contrôle des connexions DataSnap TCP/IP

De RAD Studio
Aller à : navigation, rechercher

Remonter à Application Serveur DataSnap


Introduction

Depuis RAD Studio, les serveurs DataSnap avec les composants TDSTCPServerTransport sont capables de surveiller les connexions et de fermer toute connexion TCP voulue. Les connexions sont liées à un ID de session, qui peut être utilisé dans une méthode serveur ou un gestionnaire d'authentification pour obtenir la connexion TCP pour la session en cours. Cela permet aux méthodes serveur et aux gestionnaires d'authentification de terminer une connexion pour une quelconque raison.

Ecoute des connexions

Sur le composant TDSTCPServerTransport, il existe deux nouveaux événements que vous pouvez assigner : OnConnect et OnDisconnect. Une implémentation de l'événement OnConnect peut ressembler à ceci :

 procedure TForm1.ServerTransportConnectEvent(Event: TDSTCPConnectEventObject);
 begin
   //Add both the connection and Channel (TDSTCPChannel) to a dictionary for later use
   FConnections.Add(TIdTCPConnection(Event.Connection), Event.Channel);
 end;

L'extrait de code précédent capture et stocke le canal, qui est une instance de TDSTCPChannel, ainsi que la connexion, pour un usage ultérieur. La connexion sera fournie sans un canal dans l'événement de déconnexion. Ainsi, d'une certaine façon, elle peut être utilisée pour identifier de façon unique un canal. Le canal a une fonction GetConnection, qui renverra sa connexion, si nécessaire.

Ecoute des déconnexions

Une implémentation de l'événement OnDisconnect peut ressembler à ceci :

 procedure TForm1. Server TransportDisconnectEvent(Event: TDSTCPDisconnectEventObject);
 begin
   //Remove the connection and its associated channel from the dictionary
   FConnections.Remove(TIdTCPConnection(Event.Connection));
 end;

L'extrait de code précédent est appelé quand le composant TDSTCPServerTransport est toujours actif et qu'une connexion TCP a été fermée. Si le transport a été désactivé, cet événement ne sera alors pas notifié. Notez que l'événement fournit seulement la connexion, mais cette connexion peut être utilisée pour consulter un canal que vous avec obtenu avec l'événement OnConnect.

Détection des déconnexions disgracieuses

Par défaut, l'événement OnDisconnect ne sera pas notifié si le client perd brusquement la connexion Internet. La raison est que le socket reste ouvert jusqu'à ce qu'une opération d'entrée/sortie soit tentée et échoue. Si votre système d'exploitation est configuré pour utiliser des paquets persistants pour toutes les connexions TCP/IP, selon sa configuration vous verrez éventuellement la notification de l'événement de déconnexion. Si vous voulez contrôler ce comportement sur une base par-connexion, vous pouvez alors utiliser les méthodes EnableKeepAlive et DisableKeepAlive sur le TDSTCPChannel :

 //If the connection is idle for 10 seconds, then send a keep-alive packet to check whether the client is still there.
 Event.Channel.EnableKeepAlive(10000);

L'extrait de code précédent activera la persistance pour la connexion ou le canal spécifique. Un paquet persistant est envoyé au client quand il est inactif pendant une durée supérieure au temps spécifié (10 secondes). Si le client ne répond pas, le paquet sera alors renvoyé un certain nombre de fois, comme défini par le système d'exploitation. Par exemple, dans Windows 7, il y aura 10 tentatives.

Il existe un deuxième paramètre facultatif à la procédure EnableKeepAlive : c'est un entier représentant le temps d'attente en millisecondes entre deux tentatives si un client ne répond pas à un paquet. S'il n'est pas défini, sa valeur par défaut est de 100 millisecondes.

Si vous voulez désactiver la persistance pour une connexion spécifique, obtenez alors l'instance du canal et appelez DisableKeepAlive.

Fermeture d'une connexion

Vous pouvez fermer une connexion à tout moment en obtenant le canal de la connexion et en appelant sa procédure Close. Voici un exemple :

 //Get the associated Channel for the given connection and, if successful, close it
 if FConnections.TryGetValue(Connection, Channel) then
   Channel.Close;


Voir aussi