ActionScript3网络通信简析
2014-05-30齐兵辉李清秀
齐兵辉 李清秀
摘 要:ActionScript3中的网络通信方式和之前的语言彻底不同,它的实现机制也有了根本的改变。在ActionScript2中,加载数据的方法零零碎碎分散在全局函数、LoadVars、XML等许多地方,调用的方式也是五花八门,难学、难记、难用。在ActionScript3中,将所有与外部数据交互的功能都集中到了flash.net.*包中,由专门的类来管理,实现的流程标准、统一,ActionScript3网络通信API的使用变得前所未有的简单,另外还内嵌了多种事件支持,对通信过程的控制也比以前更加精确。
关键词:Actionscript3;网络通信
中图分类号:TP393.0 文献标识码:A 文章编号:1006-8937(2014)24-0095-02
稍复杂的ActionScript3网络应用程序,一般都会涉及到加载外部数据或与服务器端脚本相互通信。
ActionScript3对网络通信的支持空前强大,目前主流的网络数据交互方式几乎全部支持。粗略的说,ActionScript3把一个成功的网络通信抽象成以下过程:
①构建通信请求对象(URLRequest)。
②使用通信请求对象,构建URLLoader对象,并发出数据请求。
③数据收到之后,发出完成事件,调用“读取完成”事件的侦听器处理返回的数据。
这里有一个要点:提交的数据放在URLRequest对象中,读取到的数据放在URLloader对象中。
这3个过程是相互独立的,耦合度较低。通信请求对象只负责构建请求的内容,它建立时并不知道何时会被URLLoader对象接纳并开始发送请求;而URLLoader对象只管发送请求和事件,并不知道自己发送的请求对象内容是什么,也不知道数据返回之后会有什么样的操作;“加载完成”事件侦听器函数中只知道完成后要干什么,不知道自己什么时候才会侦听到事件。3个重要部分的分离,给编程带来了安全性和灵活性。ActionScr-
ipt3的架构设计经常能给我们以贴心和惊喜。
要建立一个成功的通信请求,通信请求对象必须含有足够的信息,必须知道要向谁请求、通过什么方式、有没有要提交的数据。因此,这些信息包括:
请求的URL地址:对应于URLRequest对象的url属性。
请求的方式:对应于method属性,默认是GET方式。
有两种方式可选GET和POST,使用URLRequestMethod.GET和URLRequestMethod.POST常量赋值。有没有要提交的数据:数据对应于data属性,数据的格式对应于contentType属性。如果是純粹的加载,那么不需要data属性。如果要提交一部分数据,那么就要放在data属性中,比如XML文本等。
不论是纯粹的读取外部数据,还是要提交一些数据并读取返回信息,都要先发出数据请求。
发出数据请求,其实就是按照数据请求对象携带的信息,向指定地址发出请求。这部分由URLLoader对象来完成。
我们可以选择直接将URLRequest对象传入URLLoader对象构造函数,这样URLLoader对象一旦建立,就可以立刻发送请求。
如果有数据返回,那么将会放在这个URLLoader对象的data属性中。可以通过URLLoader对象的dataFormat属性来判断data属性中存储的数据格式是文本型的、二进制型的,还是变量名值对型的。
URLLoader对象会发出如下6种事件,可以让我们监听,并更好地控制加载流程:
Load()一调用,就发出Event.OPEN事件。
加载过程中,发出ProgressEvent.PROGRESS事件,包含下载字节数信息。
加载完成,发出Event.COMPLETE。
加载完成或者失败之前,会发出HTTP状态事件HTTPSta-
tusEvent.HTTP_STATUS。
加载失败,发出IOErrorEvent.IO_ERROR事件。
发现加载内容不合安全规则,发出SecurityErrorEvent.SEC-
URITY_ERROR。
侦听器函数就是标准的DOM3事件侦听器函数,没有什么特别。一般会根据具体的编程需要,选择上面的6种事件的部分或全部进行监听。
URLLoader把读取到的外部数据划分为3种格式:文本、值对、二进制。其中,普通文本、XML等以普通UTF-8字符组成的字符串文本都属于文本格式。值对格式,就是一个URLVariabl-
es对象。二进制格式数据是最强大和灵活的一种数据格式,使用ByteArray对象表示。
什么是二进制格式数据?什么是二进制文件?从本质上说,不同文件格式的差别就是信息的编码不同,而编码总是二进制的。因此,所有文件从本质上说都是二进制的。但是,这里所讲的二进制文件是为了强调和文本格式文件区分开,也就是说非文本格式文件就是这儿所说的二进制文件。所有的图像、SWF文件都可以以二进制数据格式载入,以ByteArray对象表示。
在网络应用中,XML已经毫无疑问地占据了霸主地位。我们在网络编程中,与XML型数据的交互将是最频繁的。XML类型是文本格式数据的一种,URLLoader默认的数据格式就是文本,即dataFormat=URLLoaderDataFormat.TEXT。
如果服务器端脚本是值对形式的数据,且是URL编码形式,那么就是URLVariables类型的数据,本书中为了和以前老版本中的术语一致,仍然称呼其为值对形式数据。
ActionScript3增加了对二进制格式数据的支持,实在是一大福音。本节讲述如何读取二进制格式数据。读取二进制格式数据后,二进制格式数据以ByteArray对象存储在URLLoader对象的data中。
监控加载进度很简单,只需要增加一个侦听器,侦听URL-
Loader对象发出的ProgressEvent.PROGRESS事件。事件对象是flash.events.ProgressEvent类的实例,有两个属性:bytedLoaded属性用来记录当前下载的字节数;bytesTotal属性记录总共要下载的字节数。
在ActionScript2以及以前在Flash中打开任何网址,只需要调用全局函数getURL()即可。在ActionScript3中,已經取消了getURL()这个全局函数,取而代之的是flash.net包中的函数navi-
gateToURL()。
使用navigateToURL()之前,必须导入flash.net包。API格式如下:
Public function navigateToURL(request:URLRequest,window:String=null):void
Request对象包含要跳转的网址,window字符串表示要显示request指定网址的浏览器窗口或者html框架。如果不传入Window参数,那么就是默认在新窗口打开。
Window的常用字符串有4种:“_self”表示在当前框架当前窗口打开网址;“_blank”表示在新窗口中打开网址;“_parent”表示在当前框架的父框架上打开网址;”_top”表示在当前窗口的顶级框架中打开网址。
参考文献:
[1] 赵冠伟,夏斌,聂云峰.富互联网应用程序研究初探[J].微型机与应用,2005,(12).
[2] 戴侃,杨小虎.基于J2EE 和FLEX 技术构建RIA系统的探索与实现[J].微电子学与计算机,2003,(5).
[3] 张蓓,周强,李莉,等.Flex技术及其在毕业生赠书系统中的应用[J].现代图书情报技术,2008,(5).
[4] 杨占坡,杨铭,翁颖.Flex3 RIA开发详解与精深实践[M].北京:清华大学出版社,2009.
[5] 胡洁.Flex完全自学手册[M].北京:机械工业出版社,2009.