DataSnap 用 TCP/IP 接続の監視と制御

提供: RAD Studio
移動先: 案内検索

DataSnap サーバー アプリケーション への移動


はじめに

RAD Studio を利用して開発を開始すると、TDSTCPServerTransport コンポーネントを含む DataSnap サーバーが、接続を監視して、必要に応じて TCP 接続を閉じます。接続は、セッション ID に関連付けられています。セッション ID は、現在のセッションの TCP 接続を取得するために、サーバー メソッドや認証マネージャで使用できます。これによって、サーバー メソッドや認証マネージャは、いつでも接続を終了させることができます。

接続のリスン

TDSTCPServerTransport コンポーネントでは、OnConnectOnDisconnect の 2 つの新しいイベントを割り当てることができます。OnConnect イベントの実装は次のようになります。

 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;

上のコード スニペットでは、Channel を取得して格納します。Channel は TDSTCPChannel のインスタンスで、接続と同様に後で使用します。切断イベントでは、チャネルなしで接続が提供されます。したがって、チャネルを一意に識別するために接続が使用されます。チャネルには GetConnection 関数があります。この関数は、必要であれば、その接続を返します。

切断のリスン

OnDisconnect イベントの実装は次のようになります。

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

上のコード スニペットは、TDSTCPServerTransport コンポーネントがまだアクティブの状態で、TCP 接続が閉じている場合に呼び出されます。トランスポートが破棄されている場合は、このイベントは通知されません。このイベントは接続のみを提供します。ただし、この接続は、OnConnect イベントによって取得したチャネルを検索するために使用できます。

予期せぬ切断の検出

クライアントが予期せずにインターネット接続を失った場合、デフォルトでは、OnDisconnect イベントは通知されません。これは、IO 操作を試みてそれが失敗するまでは、ソケットが開いたままになっているからです。OS の構成が、すべての TCP/IP 接続に対してキープアライブ パケットを使用するようになっている場合は、その構成に基づいて、最終的には切断イベントが通知されます。この動作を接続ごとに制御したい場合は、次のように TDSTCPChannel に対して EnableKeepAlive メソッドや DisableKeepAlive を使用します。

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

上のコード スニペットは、特定のチャネルや接続に対してキープアライブを有効にします。これによって、指定された時間(10 秒)を越えて待機状態が続いた場合は常に、クライアントにキープアライブ パケットが送信されます。クライアントが応答しない場合、このパケットは、オペレーティング システムで定義されている回数だけ再送信されます (たとえば、Windows 7 の場合は 10 回再試行されます)。

EnableKeepAlive 手続きには、もう 1 つオプション パラメータがあります。これは、クライアントがパケットに応答しない場合に、再試行する間隔を表す整数(ミリ秒数)です。特に定義しなければ、デフォルト値は 100 ミリ秒になります。

特定の接続に対してキープアライブを無効にしたい場合は、Channel インスタンスを取得し てDisableKeepAlive を呼び出します。

接続を閉じる

接続のチャネルを取得して、Close 手続きを呼び出すことによって、いつでも接続を閉じることができます。その例は次のようになります。

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


関連項目