Delphi XE断开或终止一个休眠客户端会话

r6l8ljro  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(158)

我们正在用 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中有没有办法做到这一点?

prdp8dxp

prdp8dxp1#

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

我们在XE也遇到了同样的问题。我们尝试在会话线程中使用LifeCycle := Session和一个计时器,如果用户在 x 小时内没有出现,则会自动终止会话线程。但我们无法从内部终止线程。我们无法从主线程中枚举线程连接。
所以我们将LifeCycle设置为[Server],这样我们就可以自己管理连接列表。我们必须处理所有使用[Session] LifeCycle自动发生的事情,但至少我们可以循环浏览连接列表并删除LastSeen超过 x 小时的连接。
如果升级到XE 2(现在是XE 3)是一个选项,它可能是最好的选择(因此您可以使用会话管理方法进行[Session]连接)。
如果您无法升级,那么从服务器端终止会话的唯一方法是将LifeCycle设置为[Server],然后自己进行会话管理。

t1rydlwq

t1rydlwq2#

我也有同样的问题。找到了这个解,就像这样:

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

相关问题