关闭聊天室窗口NetConnection不断开的问题及其解决

问题:

将一个视频聊天室系统从FCS升级到FMS,目前的客户端是Flash player 8,客人从浏览器登陆后,选择一个聊天室进入,此时会弹出一个新窗口,聊天室就在新窗口中。但是当关闭聊天室的时候,却并没有触发FMS程序中的onDisConnect事件,客人仍然可以听到聊天室中的声音,必须关闭所有的浏览器窗口,才会完全退出聊天室。

又一个测试:

后来又做了一个实验。先开一个带有Flash内容的窗口(和聊天室无关的站点),然后打开聊天室站点页面,再打开聊天室页面。关闭的时候先关闭聊天室页面,再关闭聊天室站点页面,发现NC仍然没有断开。直到关闭所有含有Flash内容的页面,才真正断开。

分析原因:

虽然是3个窗口,但是仍然使用的是一个ie进程,而且默认情况下所有的窗口都是一个进程。虽然聊天室窗口关闭了,但是因为其他窗口没有关闭,IE进程也没有关闭。swf文件仍然存在于ie的缓存中,所以NC连接仍然保持。如果关闭所有的窗口,IE的进程关闭了,那么NC就自然断开了。

证明分析:

为了验证上面的分析,我通过修改注册表强制IE每次打开都是单独的进程,上面的问题不复存在。

解决方法:

首先就是考虑将整个聊天室网站改成纯Flash版本,这样就不需要弹出窗口,聊天室直接就在主页,当关闭了聊天室窗口也就关闭了所有当前网站的相关窗口。不过由于上面实验发现的原因,即使是关闭了聊天室网站的窗口,如果没有关闭其他带有Flash的窗口,这个问题仍然存在,因此放弃这个思路。

又考虑到弹出窗口的时候弹出一个没有任何关闭按钮的窗口,在Flash中提供一个关闭按钮,这个关闭按钮在关闭聊天室窗口的同时也关闭NC对象。不过目前的浏览器种类繁多,不能保证用户使用的就一定是IE浏览器。

最后考虑到,窗口在关闭的时候会触发一个JavaScript的onUnLoad事件,为何不在这个事件中通知Flash关闭NC连接?按照这个思路更改程序,解决了此问题。