【问题标题】:GAE Channel API - Check if the socket is alive from JavascriptGAE 通道 API - 从 Javascript 检查套接字是否处于活动状态
【发布时间】:2013-02-07 16:13:37
【问题描述】:

我有一个使用通道 API 的应用程序。连接应该始终处于活动状态(24x7),并且我已经以这样的方式实现它,即每次通道断开连接时,都会自动创建一个新通道。这在大多数情况下都可以正常工作,但我有一些场景不会调用 onError() 方法(例如,连接的 WIFI 更改,或计算机进入睡眠状态并返回)。而且我的 JS 应用程序错误地假设通道仍然处于活动状态,而实际上它不是。

我想到的一个解决方案是 ping 服务器要求发送消息。就像一个保持活力。但这对服务器来说是一个很大的负担。 (例如,每 10 秒发送 1000 个 ping 请求的客户端相当于每秒 100 个请求)

所以我想知道是否有办法检查本地连接是否有效,这样我就不会无意中在我的服务器上执行 DoS 附加。

谢谢

【问题讨论】:

    标签: javascript google-app-engine channel-api ajax-push


    【解决方案1】:

    您可以创建一个 GAE cron 作业,告诉您的服务器发送保持活动消息,而不是让客户端请求它。这样,无论您拥有多少客户,您每 10 秒只有 1 个请求。

    不过,您需要将活动客户端列表存储在 memacache/datastore 中。

    【讨论】:

    • 但是,通过从服务器发送请求,如何确定连接是否存在? Channel API 不提供任何消息是否成功传递的反馈。我可能正在发送到一个死通道,但错误地认为它还活着。我可以让客户回复。但话又说回来,我们又回到同一个问题
    • 期待频道还活着。因此,客户端应该定期收到 ping。如果您在任何超时时间内都没有收到频道消息,请在 JS 中放置一个定时事件以触发。如果频道已死,客户端应请求新频道。
    • 很有意义。谢谢你的建议。 :)
    【解决方案2】:

    恐怕别无选择,只能要求服务器发送消息并检查它是否在合理的时间范围内返回。

    您的 JS 应用可以定期 ping 一些小的()静态文件(甚至可能在 GAE 之外),以检查连接是否断开或计算机是否进入休眠状态。这可能更便宜,但不会给你 100% 的保证。

    【讨论】:

    • ping 静态文件会让 JS 知道它可以访问互联网,但它不会指示频道是否还活着。
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2013-06-29
    • 2020-01-11
    • 2019-12-10
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多