【问题标题】:Datasnap Clients callback connection KeepAlive do not workDatasnap 客户端回调连接 KeepAlive 不起作用
【发布时间】:2018-05-01 15:53:22
【问题描述】:

我按照Delphi Labs: Datasnap XE - Callbacks 中的指南进行操作, 回调似乎运作良好。然而,让客户端闲置超过一个小时 - 似乎会导致客户端回调停止工作。我更改了服务器DSTCPServerTransport.KeepAliveEnabled、.KeepAliveInterval、.KeepAliveTime——但它没有任何帮助。

有谁知道我怎样才能让客户端保持超时连接?

1:https://edn.embarcadero.com/article/41374

【问题讨论】:

    标签: delphi callback datasnap tcp-keepalive


    【解决方案1】:

    我还在几个应用程序中使用 Datasnap 回调。我的解决方案是设置一个计时器,用于测量使用BroadCastToChannel 发送的特定消息(例如'*ping')需要多长时间才能被同一应用程序中同一通道上的注册回调接收。我在移动应用程序中允许 5 秒钟,如果在那段时间内没有收到我的 ping 回声,我认为我的回调不再起作用。我做我所谓的“回收回调”。也就是说,我取消注册前一个回调(如果失败不会导致错误)并注册一个新回调(我的回调 id 是基于时间戳的,因此它们都是唯一的)。我的“ping 计时器”每隔 1 分钟运行一次,这对于我的应用程序来说已经足够了。这个解决方案需要在这里展示很多代码,所以我希望我的描述能帮助您找到适合您的解决方案。如果您不确定,请提出问题。

    【讨论】:

    • 那是我最初的意图(实现你上面描述的)......难道没有“更好”的方式吗?如果打算扩展这样的服务,那么这样的实现不是有点开销吗?
    • 没有。我想说它是为您的服务提供可靠性的基本功能。就我而言,一旦我以这种方式实现了自己的保持活动,我发现它非常健壮。
    • 现在我正在考虑编写您建议的代码。一个问题:如果有人错过了 X 条消息,你是如何解决这个问题的。您是否将服务器上的所有消息都编入索引,然后再次发送丢失的消息?然后我回到我的问题,是不是让整个过程太混乱了?
    • 不,再次,它使您的服务非常可靠。
    • @B 夜鹰。回答你的另一个问题。在 Datasnap 服务器上拦截消息几乎是不可能的,因此您可能想要创建一个“代理服务器”,它本身就是一个“回调客户端”,用于记录(到数据库)和转发消息。我可以告诉你的是,制作可靠的服务需要大量代码。 DSClientCallBackChannelManager 组件只是您需要的众多组件之一。
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多