0

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

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

当主人关闭时,其他选项卡之一需要成为主人。我如何确保只有其中一个人试图成为大师?

如果用户关闭选项卡而 flash 无法关闭 localConnection,会导致内存泄漏吗?

谢谢

4

3 回答 3

1

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

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

无需借助卸载事件(如果不希望这样做)也可以实现类似的效果。当用户关闭主选项卡时,任何尝试连接到它正在使用的 LocalConnection 的应用程序都会出现异常。从应用程序不会抛出错误,而是可以推断此异常意味着主应用程序已关闭。然后它将承担主机角色并注册一个与主机同名的新 LocalConnection。其余如上。

于 2009-06-30T13:24:07.270 回答
0

这是一个非常有趣的问题。我很想编写一些代码来看看它是如何工作的!(要是我有时间就好了!)

首先,至于 localConnection 导致泄漏,我认为您确实必须对其进行测试,但是我认为这是可能的,但是我在类似情况下对 LocalConnection 做了很多工作,并且从未见过严重的内存泄漏(这也是比如说,在 Flash 中的非平凡代码中总是很难弄清楚什么是内存泄漏以及什么是 GC 变慢)

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

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

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

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

为了处理来自不同客户下线的链中的漏洞,主人会协调它。由于它将向从属设备发送数据,因此它会立即看到客户端是否下线。如果客户确实放弃了,它只会告诉其他客户从他们的链中删除该客户。

希望这可以帮助!

于 2009-06-28T15:22:45.750 回答
0

我也想过类似的策略。

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

感觉太脏了,我想我现在得洗个澡了。打算做一些编码。

谢谢

于 2009-06-28T20:54:52.847 回答