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


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: Aman
///

package
{
	import flash.events.StatusEvent;
	import flash.net.LocalConnection;
	import flash.text.TextField;
	import flash.utils.clearTimeout;
	import flash.utils.setTimeout;
	
	
	/**
	 * LocalConnection研究
	 * @author Aman
	 * @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()			
		}
		
//init
		override protected function creatChildren():void{
			_txt = UIUtils.creatTextArea(this , "" , 10 , 10 , 260 , 100);
			_txt.border = true;
			_txt.borderColor = 0x009cff;
			_btn = new Button("发消息B")
			Utils_UI.addChildAtPos(_btn , this , 200 , 300)
			
			_local = new LocalConnection()
		}
		
		override protected function initEvent():void{
			super.initEvent()
			_local.addEventListener(StatusEvent.STATUS , onLocal);
		}
		
		override protected function creatComplete():void{
			_local.allowDomain("*");
			_local.allowInsecureDomain("*");
			_local.client = this;
			content()
		}
		
		
		//第1步,注册到专属消息通道
		private function content():void{
			_times ++;
			var str:String = ConnectionName + _times;
			try{
				_local.connect(str)
			}catch($e:Error){
				content();
			}finally{
				_myName = str;
				sendGet();
				_functionId = setTimeout(onTime	 , 3000);
			}
		}
		
		//第2步,地毯式请求lc
		private function sendGet():void{
			for (var i:int = 1; i < 100; i++){
				if(i==_times){
					continue
				}
				var str:String = ConnectionName + i;
				_local.send(str , GetLC , _myName);
			}
		}
		
		/**没收到任何回应*/
		private function onTime():void{
			if(_lc){
				return
			}
			_functionId = 0;
			_lc = Math.random().toString();
			_txt.text = _lc + "(创始者  " + _times	+")"
		}
		
		/**收到LC*/
		public function setLC($lc:String):void{
			clearTimeout(_functionId);
			_functionId = 0
			_lc = $lc;
			_txt.text = $lc + "(" + _times	+")";
		}
		
		//第3步,收到LC请求并响应
		public function getLC($name:String):void{
			if(_lc){
				_local.send($name , SetLC , _lc);
			}
		}
		
		
//Event
		private function onLocal($e:StatusEvent):void{
			if($e.level=="status"){
				trace($e.level)
			}
		}
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值