2

Delphi XE を使用して新しい Datasnap サーバー (tcp/ip) を開発していますが、問題が発生しました。クライアントがいつ異常な方法で切断されるかはわかりません。接続が切断されるか、クライアント PC が再起動されます。

クライアントが接続を確立すると、その詳細が次のようにリストに保存されます。

TClientInfo = record
  Id: integer;
  Session: TDSSession;
  LastSeen: TDateTime;
end;
...
ClientInfoList: TDictionary<Integer, TClientInfo>;
...
//OnConnect    
ClientInfo.ClientId := ClientId;
ClientInfo.Session := TDSSessionManager.GetThreadSession;
ClientInfo.LastSeen := Now();
ClientInfoList.Add(ClientId, ClientInfo); 

理想的には、ClientInforList を反復処理し、30 分間確認されていないクライアントを切断する必要がありますが、ここで問題が発生します。

次のようにクライアントセッションを切断または終了しようとしましたが、うまくいきませんでした。

for i in ServerContainer.ClientInfoList.Keys do
  begin      
    ClientInfo := TClientInfo(ServerContainer.ClientInfoList[i]);
    ClientInfo.Session.Terminate;
  end;

Delphi XEでこれを行う方法はありますか?

4

1 に答える 1

2

XE でサーバー側から TCP/IP セッションを終了することはできません。Mat DeLong は、XE で HTTP を使用する場合にサーバー側からセッションを切断する方法を説明する記事を書き、「 XE では、この機能は現在 HTTP 接続でのみ利用可能です。XE2 では、TCP/IP でも機能します。」で終わります。

XEでも同じ問題がありました。ユーザーがx時間LifeCycle := Session表示されなかった場合にセッション スレッドを自己終了させるために、セッション スレッドでタイマーを使用してみました。しかし、スレッドを内部から終了することはできませんでした。また、メイン スレッドからのスレッド接続を列挙できませんでした。

そこで、LifeCycle[Server] に設定して、接続リストを自分で管理できるようにします。[Session] で自動的に発生するすべてのものを処理する必要がありましLifeCycleたが、少なくとも、接続リストを循環して、x時間LastSeen以上経過した接続を削除することができました。

XE2 (現在は XE3) へのアップグレードがオプションである場合、それがおそらく最良のオプションです (したがって、[セッション] 接続にセッション管理メソッドを使用できます)。

アップグレードできない場合、サーバー側からセッションを終了するには、LifeCycle[サーバー] に設定して自分でセッション管理を行うしかありません。

于 2012-09-21T12:53:11.873 に答える