Überwachen und Steuern von DataSnap-TCP/IP-Verbindungen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu DataSnap-Server-Anwendung


Einführung

Ab RAD Studio können DataSnap-Server mit TDSTCPServerTransport-Komponenten Verbindungen überwachen und beliebige TCP-Verbindungen schließen. Die Verbindungen sind mit einer Sitzungs-ID verknüpft, mit der in einer Servermethode oder einem Authentifizierungsmanager die aktuelle TCP-Verbindung für die aktuelle Sitzung ermittelt werden kann. Dadurch können Servermethoden oder Authentifizierungsmanager eine Verbindung aus einem beliebigen Grund beenden.

Empfangen von Verbindungen

Die Komponente TDSTCPServerTransport umfasst zwei neue Ereignisse, die Sie zuweisen können: OnConnect und OnDisconnect. Eine Implementierung des Ereignisses OnConnect könnte folgendermaßen aussehen:

 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;

Dieses Codefragment erfasst und speichert den Channel, der eine Instanz von TDSTCPChannel ist, sowie die Verbindung für den späteren Gebrauch. Die Verbindung wird im Ereignis zum Trennen der Verbindung ohne Kanal bereitgestellt, daher kann mit ihr gewissermaßen ein Kanal eindeutig identifiziert werden. Der Kanal hat eine GetConnection-Funktion, die bei Bedarf seine Verbindung zurückgibt.

Empfangen von Verbindungsbeendigungen

Eine Implementierung des Ereignisses OnDisconnect könnte folgendermaßen aussehen:

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

Dieses Codefragment wird immer aufgerufen, wenn die Komponente TDSTCPServerTransport weiterhin aktiv ist und eine TCP-Verbindung geschlossen wurde. Wird der Transport freigegeben, wird dieses Ereignis nicht benachrichtigt. Dieses Ereignis stell nur die Verbindung bereit, aber mit dieser Verbindung können Sie einen Kanal suchen, den Sie mit dem Ereignis OnConnect ermittelt haben.

Ermitteln von abrupten Verbindungsbeendigungen

Per Vorgabe wird das Ereignis OnDisconnect nicht benachrichtigt, wenn der Client abrupt die Internet-Verbindung verliert. Und zwar deshalb, weil der Socket geöffnet bleibt, bis eine E/A-Operation versucht wird und fehlschlägt. Wenn Ihr BS für die Verwendung von Keep-Alive-Paketen für alle TCP/IP-Verbindungen konfiguriert ist, dann wird wegen dieser Konfiguration schließlich das Ereignis zum Trennen der Verbindung benachrichtigt. Wenn Sie dieses Verhalten verbindungsweise steuern möchten, dann können Sie die Methoden EnableKeepAlive und DisableKeepAlive für TDSTCPChannel verwenden:

 //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);

Dieses Codefragment aktiviert Keep-Alive für den speziellen Kanal oder die Verbindung. Dadurch wird ein Keep-Alive-Paket immer dann an den Client gesendet, wenn er sich für länger als die angegebene Zeit (10 Sekunden) im Ruhezustand befindet. Wenn der Client nicht antwortet, wird das Paket einige Male (Anzahl vom Betriebssystem definiert) erneut gesendet. (In Windows 7 zum Beispiel 10 Mal.)

Es gibt einen optionalen zweiten Parameter für die Prozedur EnableKeepAlive, einen Integerwert, der die zu wartende Anzahl von Millisekunden zwischen erneuten Versuchen angibt, wenn der Client nicht auf ein Paket reagiert. Wenn der Parameter nicht definiert ist, werden als Vorgabe 100 Millisekunden verwendet.

Wenn Sie Keep-Alive für eine bestimmte Verbindung deaktivieren möchten, ermitteln Sie die Kanalinstanz und rufen DisableKeepAlive auf.

Schließen einer Verbindung

Sie können eine Verbindung jederzeit durch Ermittlung des Verbindungskanals und Aufruf seiner Close-Prozedur schließen. Ein Beispiel könnte folgendermaßen aussehen:

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


Siehe auch