使用localConnection监视浏览器选项卡,并在用户关闭选项卡时进行检测

时间:2009-06-28 08:26:08

标签: flash actionscript-3 localconnection

在我的应用程序中,浏览器窗口与服务器的长轮询(彗星)连接。 如果用户打开多个浏览器选项卡,则只有其中一个(称为主服务器)与服务器通信,并充当其他选项卡的代理。我想使用flash localConnection在选项卡之间交换数据。

当用户关闭持有彗星会话的主标签时会发生什么? 我可以使用带有unload事件的javascript来通知其他选项卡主选项卡正在关闭,然后关闭localConnection但卸载事件是不可靠的。 我可以使用轮询来监视主选项卡连接对象,但它听起来很脏。

当主人关闭时,其他一个选项卡需要成为主人。 我怎样才能确保其中只有一个试图成为主人?

如果用户关闭选项卡而没有闪存可以关闭localConnection, 它会导致内存泄漏吗?

由于

3 个答案:

答案 0 :(得分:1)

看到LocalConnection使用标识符字符串来处理发现,以下解决方案应该有效:

当主选项卡关闭时,它会通知其中一个从属设备它正在这样做。然后它关闭它的LocalConnection。从站现在可以注册一个新的LocalConnection,其名称与主站使用的名称相同。这样做的结果是,下次任何其他奴隶试图联系旧主人(使用旧字符串)时,他们会自动发现自己正在与“新”主人交谈。

可以在不诉诸卸载事件的情况下实现类似的效果(如果这是不合需要的话)。当用户关闭主选项卡时,任何尝试连接到其正在使用的LocalConnection的应用程序都将获得异常。从属应用程序可以改为推断此异常意味着主服务器已关闭,而不是抛出错误。然后它将接受主角色并注册一个与主节点同名的新LocalConnection。其余的如上所述。

答案 1 :(得分:0)

这是一个非常有趣的问题。我很想尝试编写一些东西,看看它是如何工作的! (如果我只有时间!)

首先,至于导致泄漏的localConnection,我认为你真的必须测试一下,但我认为这是可能的但我在类似的情况下使用LocalConnection做了很多,并且从未见过显着的内存泄漏(其中也就是说,弄清楚什么是内存泄漏,什么只是GC缓慢,总是难以在Flash中的非平凡代码中找到)

关于如何构建这个东西的更大问题,我无法给出明确的答案,但这里有一些想法。

在我看来,每个SWF的逻辑流程必须是这样的:

  • 检查我是否是第一个(连接到控制通道)
  • 如果是这样,启动控制通道并告诉JS通过ExternalInterface启​​动彗星连接
  • 如果没有,连接到控制通道并请求双向连接(此时每个从属SWF将生成一个随机ID并将其发送给主站 - 此ID将用作来自该数据的数据的LC名称主人到奴隶)

为了处理自我修复的方面,我认为你可以做一些类似于连锁信的事情。也就是说,当每个SWF连接到主设备时,它可以接收从设备列表。如果连接死了,每个客户端都会查看它在列表中的位置。如果它是列表中的第一个从站,它将接管主站 - 重新启动控制通道,并告诉JS启动新的彗星连接。然后,每个其他奴隶都会看到服务器回来了,并将现在的主人从他们的链中出列。

要处理来自各个客户端的链中的漏洞,主人会协调它。由于它将向从属设备发送数据,因此如果客户端掉线,它会立即看到。如果客户端确实丢失了,它只会告诉其他客户从他们的链中删除该客户端。

希望这有帮助!

答案 2 :(得分:0)

我也想到了类似的策略。

第一个窗口将成为主窗口。 额外的窗户将成为奴隶并告诉大师他们的存在。 每个从站将每100ms轮询主站以验证它是否存活。 如果主服务器未处于活动状态,则列表中下一个的从服务器将成为主服务器。 列表中下一个从属的奴隶仍然是奴隶,但期望第一个奴隶成为主人。 所以在接下来的100ms中,其余的奴隶将尝试轮询下一个主人 如果他不在那里,下一个将成为主人......

感觉很脏,以为我现在不得不洗个澡。 要做一些编码。

由于