您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第22章 ActionScript 30本地通信
第22章本地通信ActionScript本地通信完成不同FlashPlayer之间的数据互通,以及本地计算机上的数据存储任务。FlashPlayer利用本地连接LocalConnection,完成本地机器上不同FlashPlayer之间的方法回调与数据通信,利用本地存储把数据存放在本地磁盘空间。本章将对本地连接LocalConnection以及利用SharedObject对象实现本地数据存储部分的知识点进行介绍。22.1本地连接LocalConnection本地连接的作用是实现本地机器上两个Flash应用之间的相互通信。这些Flash应用可以是一个SWF文件,可以是一个嵌入到FlashPlayer播放器的可执行文件,或者是嵌入在网页上的SWF文件。如果这些Flash都在同一台机器运行,那么它们就可以通过本地连接进行方法回调与数据通信。本节将介绍本地连接LocalConnection对象的使用方法,以及在异域模式下使用LocalConnection对象所需要注意的问题。最后是一个本地连接的应用示例,以加强读者对于本地连接LocalConnection对象的理解。22.1.1使用本地连接本地连接LocalConnection对象用于在本地机器上两个Flash应用程序间的通信。虽然本地通信也可以应用在一个Flash应用上,但是这种本地连接的应用方式并没有什么太大的意义。所以,使用本地连接应该至少有两个Flash应用。其中一个应用作为服务器,另外一个则作为客户端。服务器应用上定义了一些方法,供客户端回调。创建服务器应用首先要创建一个LocalConnection对象,并调用connect()方法启动监听等待客户端发出的命令。代码如下:varlcon:LocalConnection=newLocalConnection();//创建本地连接lcon.connect(LCName);//使用连接名以上代码使用new关键字创建了LocalConnection对象,并调用connect()方法在指定的连接上等待客户端调用。为了给客户端提供回调函数,需要为LocalConnection对象指定client属性。默认情况下,client属性指向LocalConnection对象自身。varclient:Object=newObject();//定义客户端对象client.test=function(s:String):void//定义回调函数{trace(SERVER:+s);}第22章本地通信·481·以上代码指定LocalConnection对象的客户端,并为客户端对象定义回调函数。客户端对象需要一个Object类型的对象,并在其上定义方法以便客户端回调。为了检查本地连接的状态,需要为本地连接添加异步异常事件侦听器与连接状态事件侦听器。代码如下:lcon.addEventListener(StatusEvent.STATUS,onStatus);//网络状态事件lcon.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onSyncErr);//异步异常functiononStatus(e:StatusEvent):void{if(e.level==error){//异常处理代码}}functiononSyncErr(e:AsyncErrorEvent):void{//异常处理代码}以上代码为LocalConnection对象添加异步异常事件侦听函数与连接状态事件侦听函数。在这两个侦听函数中处理回调时的程序异常。客户端则用于连接到服务端并调用服务端的方法。使用本地连接的客户端调用服务端方法同样需要创建LocalConnection对象,并调用LocalConnection对象的send()方法执行调用。代码如下:varlcon:LocalConnection=newLocalConnection();//创建本地连接lcon.send(LCName,test,param1,param2,...);//发送数据以上代码创建一个本地连接对象并执行send()方法调用本地连接服务端的回调方法。send()方法的第一参数是本地连接的名称,第二个参数是回调方法的名称,之后是回调的参数列表。因为客户端不被回调,所以可以不指定其client属性。同样,客户端在调用过程中也会有相关的事件方式,如果有必要可以为其添加异步异常事件侦听函数与连接状态事件侦听函数。22.1.2异域调用Flash应用很多会被嵌入到网页中,这些Flash可以来自不同的域。默认情况下,本地连接只允许来自本地域的SWF回调,而不允许来自其他域的SWF回调。假设网页中嵌入了3个SWF文件:SiteA1.swf、SiteA2.swf和SiteB.swf,其中SiteA1.swf和SiteA2.swf来自,而SiteB.swf则来自。SiteA1.swf和SiteA2.swf之间可以不受限制地使用本地连接互相调用。而SiteA1.swf如果要使用本地连接调用SiteB.swf中的回调方法则是不允许的。为了允许SiteA1.swf调用SiteB.swf中的回调方法,则SiteB.swf中必须使用LocalConnection对象的allowDomain()方法,允许来自中的方法。代码如下:lcon.allowDomain(“”);//允许安全域访问ActionScript3.0开发技术大全·482·以上代码使当前SWF中定义的回调方法允许来自文件通过本地连接调用。如果当前SWF中定义的回调方法允许来自多个域的SWF调用,则可以使用allowDomain()方法指定多个域名。代码如下:lcon.allowDomain();//允许多个交叉域名访问以上代码使当前SWF中定义的回调方法允许来自多个不同域的SWF文件通过本地连接调用。如果此时有个来自中定义的回调函数,因为并不在允许访问的域名列表中,所以引发程序异常。为了捕获这个异常,需要为LocalConnection对象添加安全异常处理侦听函数。代码如下:lcon.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecuErr)//处理安全异常事件functiononSecuErr(e:SecurityErrorEvent):void{//异常处理代码}以上代码为LocalConnection对象添加安全异常处理侦听函数,以便在回调过程受到FlashPlayer安全沙箱限制时处理该安全异常。从来自中定义的回调方法时,send()方法需要指定回调的域名。代码如下:lcon.send();//发送数据到指定主机的本地连接以上代码指定回调方法所在的域名进行回调。如果SiteB.swf允许来自任意域的SWF通过本地连接调用定义在其上的回调方法,则可以指定allowDomain()方法的参数为星号(*)。代码如下:lcon.allowDomain(*);//允许所有以上代码使当前SWF接受来自任意域的SWF通过本地连接调用其回调函数。作为本地连接回调函数的客户端在调用回调方法时,send()方法也无需指定域名。22.1.3应用授权示例本例是通过本地连接实现的一个简单应用示例,实现应用程序授权启动。该示例分为应用程序和授权程序两部分。应用程序部分是通常的Flash应用程序,它可以是一个简单的动画或是某些与用户业务相关的程序Flash程序。应用程序作为服务器端运行。而授权程序则作为客户端运行,每隔一定时间它都会向应用程序发出授权命令。应用程序接受到授权后延长等待关闭的时间。如果授权程序关闭,那么应用程序就无法及时得到授权,它将自动关闭。所有授权程序就像某些财务应用中的USB密钥,只有拥有授权程序的用户才可以使用应用程序。以下是建立应用授权示例的具体步骤。(1)新建FlexActionScript项目。在FlexBuilder3中选择菜单栏的File|New|ActionScriptProject命令,打开NewActionScriptProject对话框。在ProjectName文本框中输入项目名称为LocalCommDemo,单击Finish按钮完成新建。第22章本地通信·483·(2)创建应用程序作为服务端应用。在FlexNavgator视图中的LocalCommDemo项目名上右击,在弹出的快捷菜单中选择New|ActionScriptClass命令打开NewActionScriptClass对话框。在Class文本框中输入App,在Superclass文本框中输入Sprite。单击Finish按钮完成App类新建。编辑App.as文件,代码如下:package{importflash.display.Sprite;importflash.events.AsyncErrorEvent;importflash.events.StatusEvent;importflash.events.TimerEvent;importflash.net.LocalConnection;importflash.system.fscommand;importflash.text.TextField;importflash.text.TextFieldAutoSize;importflash.utils.Timer;publicclassAppextendsSprite{privatevarlcon:LocalConnection;//本地连接privatevartimer:Timer;//计时器对象privatevarshutDownCount:Number;//关闭计数privatevarappMsg:TextField;publicfunctionApp(){lcon=newLocalConnection();//创建本地连接lcon.client=this;//指定回调对象//添加事件lcon.addEventListener(StatusEvent.STATUS,onStatus);lcon.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onSyncErr);lcon.connect(CHECK_APP);//等待回调shutDownCount=5;//创建文本框,设置相关属性appMsg=newTextField();appMsg.autoSize=TextFieldAutoSize.LEFT;appMsg.x=10;appMsg.y=10;this.addChild(appMsg);//创建计时器并启动计时器timer=newTimer(1000);timer.addEventListener(TimerEvent.TIMER,checkShutDown);timer.start();}以上代码定义了App类的相关属性及其构造函数。在App类的构造函数中创建本地连接,创建消息框以及计时器。下面继续定义App类的代码。//计时器调用方法privatefunctioncheckShutDown(e:TimerEvent):void{shutDownCount--;if(shutDownCount=0){fscommand(quit,);//关闭程序}log(检查程序是否需要关闭,剩余+shutDownCount+秒。)appMsg.
本文标题:第22章 ActionScript 30本地通信
链接地址:https://www.777doc.com/doc-319175 .html