【问题标题】:Delphi XE Disconnect or Terminate a datasnap client sessionDelphi XE 断开或终止数据快照客户端会话
【发布时间】:2012-09-13 18:09:38
【问题描述】:

我们正在使用 Delphi XE 开发新的 Datasnap 服务器 (tcp/ip),但遇到了问题。我们不知道客户端何时以异常方式断开连接,即。连接断开或客户端电脑重新启动。

当客户端建立连接时,我们将其详细信息保存在列表中,如下所示:

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 中有没有办法做到这一点?

【问题讨论】:

  • ServerClass.LifeCycle 是如何设置的? [ServerSessionInvocation]
  • 生命周期设置为 [Session]。

标签: delphi delphi-xe datasnap


【解决方案1】:

您不能在 XE 中从服务器端终止 TCP/IP 会话。 Mat DeLong 写了一篇文章,解释了在 XE 中使用 HTTP 时如何从服务器端断开会话,并以“在 XE 中此功能目前仅适用于 HTTP 连接。在 XE2 中,它也适用于 TCP/ IP。"

我们在 XE 中遇到了同样的问题。我们尝试在会话线程中使用LifeCycle := Session 和计时器来在 x 小时内没有看到用户时自行终止它。但是我们不能从内部终止线程。而且我们无法从主线程枚举线程连接。

所以我们将LifeCycle 设置为[Server],这样我们就可以自己管理连接列表。我们必须处理所有使用 [Session] LifeCycle 自动发生的事情,但至少我们可以循环浏览连接列表并删除 LastSeen 超过 x 小时的连接.

如果升级到 XE2(现在是 XE3)是一种选择,它可能是最好的选择(因此您可以使用会话管理方法进行 [Session] 连接)。

如果您无法升级,那么从服务器端终止会话的唯一方法是将LifeCycle 设置为 [Server] 并自己进行会话管理。

【讨论】:

  • 感谢您的信息。我不确定我们能否使用 [Server],但我会看看。我们正试图说服当权者升级,但这是一个缓慢的过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多