您的位置:首页 > 其它

实验证明LocalConnection跨浏览器功能陷落,现在的世界已经不是我记忆中的世界

2017-07-11 23:10 555 查看
LocalConnect是做什么用的,引用Adobe原文:在运行于同一台客户端计算机上的 SWF 文件之间进行通信,但这些 SWF 文件可以在不同的应用程序中运行。

但是这个类已经不像9年前那么好用了,本人花了2个小时时间,做了验证的试验,希望能给更多人节约一些时间。

LocalConnect特性如下:

1. 一个通道只能单向链接一对swf(一收一发)

2. 当一个通道已经被注册了,再被其他swf重新注册会引发错误(AsyncErrorEvent)

3. 当注册某个通道的swf被关闭后,该通道得到释放,可被其他swf成功注册

实验原理如下:

1. 按数字递增生成通道名并进行注册,直到成功注册LocalConnect通道

2. 在该通道上注册2个接受其他swf件的函数。一个是set方法,此方法接收一个由其他swf生成的随机数,收到后储存并显示出来。另一个是get方法,此方法接收一个通道名将已存储的随机数发送到此通道的set方法上

3. 批量(从1-100按规则生成通道名,碰到本swf通道名跳过)的向通道发get方法进行请求,请求参数中带上步骤1中注册成功的通道名。

4. 如果进行了步骤3后,set方法被调用到,则进入到步骤2中的相关步骤,若未得到响应,则生成一个随机数然后存储起来并显示到舞台上。

实验结论如下:

1. 通用FlashPlayer与FireFox版Player之间可以通信(含客户端本地swf)

2. Google内置FlashPlayer与上述两Player之间不能通信

3. 部分浏览器的小号窗口与非小号窗口之间,小号窗口之间不能通信(搜狗不可以,遨游可以)

这个是有历史原因的,AS3发布是在2006年,当时的绝大多数人的浏览器为IE或Firefox,GoogleChrome还没远有问世,而这个时候Adobe发布了AS3当然也包含LocalConnect。也就是说在那个时候如果我们用LocalConnect来实现不同网页或浏览器中的swf通信是完全没有问题的,但时过境迁,GoogleChrome内置了一个比较特殊的FlashPlayer,一些浏览器具有多核特性,很多浏览器有小号窗口隐私窗口等功能......这些浏览器厂商的技术实现手段后天造成了LocalConnect的失效。我所熟悉的事物变得陌生了,又一次证明了一句话:这个世界在变,唯一不变的就是改变本身。

附件代码

///////////////////////////////////////////////////////////
//  AAA_trunk.as
//  Macromedia ActionScript Implementation of the Class AAA_trunk
//  Created on:      2015-11-11 上午11:19:21
//  Original author: Zhangwei
///////////////////////////////////////////////////////////

package
{
import flash.events.StatusEvent;
import flash.net.LocalConnection;
import flash.text.TextField;
import flash.utils.clearTimeout;
import flash.utils.setTimeout;

/**
* LocalConnection研究
* @author Zhangwei
* @version 1.0
*
* 注:
* 1. 通用FlashPlayer与FireFox版Player之间可以通信(含客户端本地swf)
* 2. Google内置FlashPlayer与上述两Player之间不能通信
* 3. 部分浏览器的小号窗口与非小号窗口之间,小号窗口之间不能通信(搜狗不可以,遨游可以)
*
*
* @created  2015-11-11 上午11:19:21
*/
[SWF(width="600" , height="600")]
public class AAA_trunk extends MyRoot{

private static const ConnectionName:String = "connectionName";
private static const GetLC:String = "getLC";
private static const SetLC:String = "setLC";

private var _myName:String;
private var _times:int = 0;
private var _lc:String = null;

private var _local:LocalConnection;

private var _btn:Button;
private var _txt:TextField;
private var _functionId:uint;

public function AAA_trunk()
{
super()
"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐