gpt4 book ai didi

Delphi XE 断开或终止 datasnap 客户端 session

转载 作者:行者123 更新时间:2023-12-02 00:06:22 29 4
gpt4 key购买 nike

我们正在使用 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 分钟内未出现的任何客户端的连接,但这就是我遇到的问题。

我尝试按如下方式断开或终止客户端 session ,但没有成功。

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

在 Delphi XE 中有没有办法做到这一点?

最佳答案

您无法在 XE 中从服务器端终止 TCP/IP session 。 Mat DeLong 写了一篇文章,解释了如何在 XE 中使用 HTTP 时从服务器端断开 session ,并以“在 XE 中,此功能当前仅适用于 HTTP 连接。在 XE2 中,它也适用于 TCP/知识产权。

我们在 XE 中遇到了同样的问题。我们尝试在 session 线程中使用 LifeCycle := Session 和计时器来自行终止 session 线程(如果用户在 x 小时内没有出现)。但我们无法从内部终止线程。而且我们无法从主线程枚举线程连接。

因此,我们将LifeCycle设置为[Server],以便我们可以自己管理连接列表。我们必须处理 [Session] LifeCycle 自动发生的所有事情,但至少我们可以循环遍历连接列表并删除 LastSeen 超过的连接x 小时。

如果可以选择升级到 XE2(现在是 XE3),那么它可能是最佳选择(这样您就可以使用 [Session] 连接的 session 管理方法)。

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

关于Delphi XE 断开或终止 datasnap 客户端 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528504/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com