第22章AS3.0与网络通信
第22章 AS3.0与网络通信
Flash之所以能够有着越来越大的发展空间,其良好的数据交互功能也起着极为重要的作用。在ActionScript 3.0中,所有的与外部数据进行交互的功能都被放在flash.net.*包中,有专门的类进行管理,而且实现了流程的的标准、统一,使Flash与外界数据的交互更加的清晰与简单。
本章讲着重介绍ActionScript 3.0与外界数据交互的原理、Flash与外部数据的连接和交互以及Flash与计算机本地数据的交互操作。
1.数据通信基础
在创建复杂的ActionScript 3.0应用程序时,通常需要与服务器端脚本进行通信,或者从外部 XML 文件或文本文件加载数据。
在ActionScript 3.0中,使用URLLoader和URLRequest类来加载外部文件。加载成功的文件可使用特定类来访问数据,具体使用何类,取决于加载数据的数据类型。比如如果加载数据的格式为名称值对类型,则可以使用URLVariables类来分析服务器结果。如果加载的文件是外部XML文档,则可以使用XML类的构造函数、XMLDocument类的构造函数或XMLDocument.parseXML()方法来分析XML文档。
本节讲介绍数据通信的原理、从外部文件或服务器脚本中加载数据和将数据发送到服务器脚本方法。
1)构建通信请求过程
在ActionScript 3.0中,要实现一个网络通信,需要三个过程来实现,具体为:
(1)使用URLRequest创建通信请求对象。
(2)使用通信请求对象,创建URLLoader载入对象,并发出请求的要求。
(3)监听URLLoader对象,在响应完成事件后,返回要处理的数据。
下面来逐步介绍通信的过程和方法。
1.构建通信请求对象
2.发出数据请求
3.获取返回数据
2)加载文本格式数据
文本格式数据包括:普通文本、XML、HTML等以UTF-8字符组成的字符串文本都属于文本格式。
下面的示例实现从外部的test.html文件种读取数据,并把它显示在文本框中,实现读取外部html网页格式文本的效果。test.html文本内容如图所示。
3)加载值对格式数据
如果要加载的外部文本时值对格式的数据,并且以URL形式编码,则需要将URLVariables
的
dataFormat类型设置为URLLoaderDataFormat.VARIABLES。一般的值对格式的数据样式如下所示。
variable1=value1&variable2=value2。
下面的示例实现从外部的test.txt文档中取得值对格式的数据,并在Flash中使用文本进行显示。test.txt文档内容如下所示。
标题=AS3.0基础教材&作者=浪子啸天&支持网站=http://www.flasc.cn
4)加载二进制格式数据
二进制文件是指包含在ASCII及扩展ASCII字符中编写的数据或程序指令的文件。计算机文件基本上分为二种:二进制文件和ASCII(也称纯文本)文件,图形文件及文字处理程序等计算机程序都属于二进制文件。ASCII则是可以用任何文字处理程序阅读的简单文本文件。 在ActionScript 3.0中,二进制文件主要是为了强调与文本文件的区分,大部分的非文本格式文件都被归为二进制文件。在ActionScript 3.0中,所有的图像、SWF文件都可以以二进制格式载入,以ByteArray字节数组来表示,此数组储存在URLLoader对象的data属性中。
5)发送数据
如果需要向服务器发送数据,可以有两种方式可供选择:一是若只是发送不需要返回数据,则可以使用sendToURL()方法来实现,其用法格式如下:
sendToURL(req:URLRequest)
二是既需要发送数据,也需要返回数据,则使用Loader对象的load()方法来实现。通常的数据发送需要执行下面的两步操作:
(1)将需要提交的数据放入URLRequest对象的data属性中,然后使用URLLoader对象的load()方法发送数据。
(2)从URLLoader对象的data属性中获取返回的数据并分析。
下面的示例实现将Flash中的数据发送到后台的asp文件中,并返回响应的数据信息。
6)打开外部链接效果
在ActionScript 3.0中,要在Flash中打开网址,需要使用flash.net包中的navigateToURL()函数来实现。其用法格式如下所示。
navigateToURL(request:URLRequest, window:String = null)
说明:此方法实现在包含Flash Player容器的应用程序中,通常是在一个浏览器中,打开或者替换一个窗口。
参数说明如下:
request:URLRequest对象,指定要链接到哪个URL网页地址。
window:浏览器窗口或HTML帧,其中显示request参数指示的文档。可以输入某个特定窗口的名称,或者是下面的4个值之一:“_self”指定当前窗口中的当前帧打开网页;“_blank”指定一个新窗口打开网址;“_parent”指定当前窗口的父级窗口打开网址;“_top”指定当前窗口中的顶级框架中打开网址。
2.与JavaScript通信
在Flash应用程序中,常常使用Web浏览器作为宿主程序,以实现Flash Player播放器与外部数据之间的数据交换。在ActionScript 3.0中,使用ExternalInterface类实现Flash和JavaScript脚本进行交互操作。本节将介绍Flash到JavaScript和JavaScript到Flash的数据交互的实现方法。
ExternalInterface类是Flash外部的应用程序的编程接口,是一个能够在在ActionScript和Flash Player容器(通常为Web浏览器)之间实现直接通信的应用程序编程接口。使用此接口,可以实现包含JavaScript的HTML页与ActionScript之间的通信。
在Flash Player中,可以使用HTML页中定义的的JavaScript来调用ActionScript函数。ActionScript函数可以返回一个值,JavaScript会立即接收它作为该调用的返回值。
1)JavaScript脚本简介
JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,此语言可以被嵌入到HTML文件之中。使用JavaScript,可使网页变得生动,能够重复使用同一段代码,能够使与HTML文断简化,减少下载时间。
javaScript语言有很多优点,具体如下:
1.使用简单
2.动态交互
3.跨平台操作
4.节约页面资源
2)在网页中加入JavaScript
有两种方法可以实现在网页中加入JavaScript代码,分别为:直接加入HTML文档和间接引用js文件。
1.直接加入HTML文档
2.间接引用js文档
3)Flash向JavaScript传递数据
要实现Flash向JavaScript传递数据,可以使用ExternalInterface类的call()方法采用异步调用的方式调用JavaScript的函数来实现。所谓的异步调用,指的是无需等待函数的返回值就让操作继续进行的函数调用方式。
ExternalInterface类的call()方法,语法格式如下所示。
call(functionName:String,...arguments)
说明:此方法为FlashPlayer容器公开的函数,不传递参数或传递多个参数。如果该函数不可用,调用将返回null;否则,它返回由该函数提供的值。
4)JavaScript向Flash传递数据
要实现JavaScript向Flash传递数据,可以使用ExternalInterface类的addCallback()方法将ActionScript中的函数注册为可以从容器中进行调用。成功调用addCallBack()后,
在容器中使
用JavaScript或ActiveX代码可以调用在Flash Player中注册的函数。
ExternalInterface类的addCallback()方法,语法格式如下所示。
addCallback (functionName:String, closure:Function)
functionName:要在容器中调用的函数的函数名称。
要调用的closure函数。其可能是一个独立的函数,或者可能是引用对象实例方法的closure方法。通过传递closure方法,可以将回调定向到特定对象实例的方法。
利用JavaScript向Flash传递数据的过程,可以实现下面的操作:
调用ActionScript函数。
使用标准的函数调用表示法传递参数。
将值返回给JavaScript函数。
3.So本地数据存储
Flash影片运行过程中,大多数的数据都存储于影片本身,一旦影片被关闭,这些数据也就从内存中被清除掉,下次运行时,数据将从头开始。若想存储数据或者让客户端的多个影片共享同一组数据,就要想办法把数据存储在Flash播放器之外。
在ActionScript 3.0中,SharedObject类实现了在客户端机器中持久性存储数据。有两种类型的共享对象:本地和远程。本节主要介绍在本地储存数据。
1)创建ShareObject对象
Flash的ShareObject对象一般简称为SO,类似于Web浏览器中的cookies。它们被一些开发者称为“超级cookies”,因为SO可以存储大量数据,且存储和读取的都是原生的ActionScript类型数据。
ShareObject对象默认的空间大小100KB,用户可以通过FlashPlayer'sSettingsManager控制的使用空间大小,来严格限制被使用的空间。存储在本地计算机的SO文件是一种二进制文件,扩展名为.sol。不同的SWF影片可以通过flash.net.SharedObject类进行读写.sol文件。
创建的.sol文件被放置在Flash播放器对应的应用程序数据目录,以Windows为例,目录为:C:\Documents and Settings\Administrator\Application Data\Macromedia\Flash Player\#SharedObjects,在此主目录下使用随机字符命名目录,记录数据。
2)向SO上写入数据
要实现添加数据到SO上,只需给SO对象的data属性添加属性值。共享对象SO有个内建的属性data,data属性类型为object,因而可以添加任何信息上去。如下面的示例代码所示。 //存储username值给so共享对象
so.data.username=
注意:既不能直接向SO共享对象赋值,也不能直接向SO共享对象的data属性赋值,这样的结果都是错误的。
如下面的两行写入数据的方法都是错误的,错误代码如下所示。
so.username=
so.data=
3)读取SO数据
要实现在客户端读取SO数据,原理很简单。因为这些持久性数据都保存在共享对象的data属性里,只需要访问Data对象的相关属性就Ok了。
下面的示例实现读取SO中储存的数据,代码如下所示。
var so:SharedObject=SharedObject.getLocal(
//将数据写入so
so.data.username=
so.data.sex=
//写入数据
so.flush()
//读取so中的username
var user=so.data.username
trace(user)//输出:浪子啸天
trace(so.data.sex)//输出:男
4)删除保存的SO共享数据
要实现删除共享对象中的某个属性值或者删除整个共享对象,需要使用两种不同的方法:用delete删除共享对象的data属性中的值;使用clear()方法清除整个共享对象。
下面的示例使用delete关键字删除SO共享对象的data对象中的sex属性,代码如下所示。 var so:SharedObject=SharedObject.getLocal(
//将数据写入so
so.data.username=
so.data.sex=
//写入数据
so.flush()
//删除so中的sex属性
delete so.data.sex
trace(so.data.sex)//输出:undefined,说明删除成功
trace(so.data.username)//输出:浪子啸天