首页 > 范文大全 > 正文

AS3下Flash Remoting自定义类的实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇AS3下Flash Remoting自定义类的实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:Flash技术发展到今天,其语言经历过三个版本,从最简单的实现动画的跳转交互,到如今的大项目的开发。AMF的发展也经历过两个版本,从早期支持AS1.0和AS2.0的AMF0,到现在支持as3.0的AMF3。该文详细论述了AMF的功能及数据处理过程,并实现简化AMF使用的自定义类。

关键词:flash remoting;AMF;EventDispatcher

中图分类号:TP317文献标识码:A文章编号:1009-3044(2010)05-1196-03

Under the AS3 Flash Remoting Custom Classes to Achieve

XIONG Huan-yan, XU Fang

(Jiangxi Modern Polytechnic College, Nanchang 330012, China)

Abstract: Flash technology developed to today, the language went through three versions, from the simplest realization of the jump animation interactive, to today's large project development. AMF development has also gone through two versions, from earlier AMF0 support AS1.0 and AS2.0, to the present AMF3 support AS3.0. This paper discusses in detail the functions of AMF and data processing, and the use of simplified AMF custom class.

Key words: Flash Remoting; AMF; EventDispatcher

1 Flash Remoting的核心技术:AMF

为了处理复杂数据类型,采用一种独有的方式使Flash与应用服务器间可以来回传送数据势在必行。于是AMF应运而生。

AMF从早期的AMF0发展到现在的AMF3。AMF3用作AS 3.0的默认序列化格式,而AMF0则用作旧版的AS 1.0和2.0的序列化格式。在网络传输数据方面,AMF3比AMF0效率更高。AMF3能将int和uint对象作为整数(integer)传输,并且能序列化AS 3.0才支持的数据类型, 比如ByteArray,XML和IExternalizable等。

2 AMF简介

AMF(Action Message Format)是Adobe独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,它是基于http协议的轻量级数据交换协议,从而为Flash 播放器与Flash Remoting网关通信提供了一种轻量级的、高效率的通信方式。

AMF可用于Flash Remoting、Local Connection和Flash Communication Server,它最大的特色在于可直接将Flash的内置对象(如Object, Array,String等)传回服务器端,并且在服务器端自动进行解析成适当的对象(如Flash的数组传回PHP时就会自动转换为关联数组),这个特色对开发者最大的好处在于不再需要人工处理 “序列化” 与 “反序列化”的繁复工作,不但精确度更高,同时开发也更省时间。

由于AMF是二进制格式并且编码时经过高度压缩,因此非常适合用来传递大量的资料,根据FlashORB网站的测试(主要针对Web Service与Flash Remoting进行测试),当数据量越大时,Flash Remoting的传输效率就越高,远远超过Web Service,至于XML、URLLoader,由于使用纯文本的传输方式,效率就更不能与Flash Remoting相提并论了。

3 AMF内容处理过程

AMF的内容处理过程大致如下(如图1所示):

1)客户端以POST方式向服务器发送序列化请求数据流;

2)服务器端适配器对接收到的数据流进行反序列化,得到服务器端程序能够识别的数据,并建立一个响应(Response)消息;

3)Debug开始;

4)对反序化后的数据进行各种处理,并得到返回值;

5)对响应流进行序列化;

6)将响应数据流发送Http响应给客户端。

4 Flash Remoting的应用

Flash Remoting的调用实现都基于.NetConnection类和.Responder类。其中NetConnection类可以调用远程应用程序服务器上的命令;Responder类提供了一个对象,该对象在NetConnection.call() 中使用以处理来自与特定操作成功或失败相关的服务器的返回值,使用过程如下:

1)创建远程服务器的连接对象:

var _connection:NetConnection = new NetConnection();

2)创建服务器返回值的处理对象:

_responder = new Responder(onResultHandler, onFaultHandler);

其中:如果对服务器的调用成功并返回结果,则调用自定义函数onResultHandler

如果服务器返回一个错误,则调用自定义函数onFaultHandler

3)连接远程服务器网关:

_connection.connect("amfphp/getway.php");

connect()方法并不会立即连接网关URL,如果URL不合法或服务器发生异常,都不会收到错误,直到真正调用方法之后。

4)调用远程服务器上的命令

_connection.call("classPath.method", _responder, 可选参数列表);

其中:第一个参数用点分隔符格式的路径的形式指定远程服务器的方法

第二个参数指定Responder对象,用于处理服务器的返回值

可选参数列表将若干可选参数传递给第一个参数所指定的方法

5)编写自定义函数onResultHandler和onFaultHandler,分别用来处理成功返回结果或返回一个错误。如下所示:

function onResultHandler(resultData:*):void {

//resultData为调用成功后返回的结果,其数据类型为返回结果的类型

}

function onFaultHandler(faultData:Object):void {

//faultData为调用失败后返回的错误对象

//其中faultData.description为调用失败后返回的错误信息

}

5 Flash Remoting自定义类

从上述的实现过程来看,利用Flash Remoting调用远程服务器命令,每次都要创建NetConnection和Responder两个对象,并手动实现它们的连接,比较繁琐。为了使得利用Flash Remoting调用远程应用程序服务器上的命令更加方便实用,可创建一个自定义类对其进行封装,完整的实现程序如下:

package {

import .NetConnection;

import .Responder;

import flash.events.*;

//自定义类FlashRemoting继承自EventDispatcher类,使其具有调度事件的功能

public class FlashRemoting extends EventDispatcher {

private var _conn:NetConnection;

private var _responder:Responder;

private var _data:*;//存放调用远程服务器命令成功后的返回值

public function FlashRemoting(gateway:String) {

_responder = new Responder(onResultHandler,onFaultHandler);

_conn = new NetConnection();

_conn.connect(gateway);

_conn.addEventListener(_STATUS,nsHandler);

}

//调用远程服务器上的命令,第一个参数为服务器命令名,

//后面若干可选参数为传递给服务器命令的参数

public function call(classFunc:String, ...args):void {

var parameters:Array = args;

parameters.unshift(classFunc, _responder);

_conn.call.apply(this, parameters);

}

//(只读属性)获取调用远程服务器命令成功后的返回值

public function get data():* {

return _data;

}

//调用成功后接收返回值,并调度PLETE事件

private function onResultHandler(resultData:*):void {

_data = resultData;

var tmpEvt:Event = new Event(PLETE);

dispatchEvent(tmpEvt);

}

//调用失败后调度ErrorEvent.ERROR事件

private function onFaultHandler(faultData:Object):void {

var tmpEvt:ErrorEvent = new ErrorEvent(ErrorEvent.ERROR);

tmpEvt.text = faultData.description;

dispatchEvent(tmpEvt);

}

private function nsHandler(evt:NetStatusEvent):void {

trace(event.info.code);

}

}

}

编写好后,在程序中利用自定义类FlashRemoting调用远程服务器端命令的方法如下(以下以PHP的amfphp为例,实现调用PHP的HelloWorld类中的say方法):

var fr:FlashRemoting = new FlashRemoting("amfphp/gateway.php");

fr.addEventListener(PLETE, onResultHandler);

fr.addEventListener(ErrorEvent.ERROR, onErrorHandler);

function onResultHandler(evt:Event):void{

trace(evt.target.data);

}

function onErrorHandler(evt:ErrorEvent):void{

trace(evt.text);

}

fr.call("HelloWorld.say");

6 与后端集成

Flash是前端的界面技术,而后端和数据库交互或大型运算依然需要依托Java、.Net、PHP、Ruby等语言。早在Flash MX的时候Adobe就提出AMF技术,即将Java等语言的对象转换为ActionScript对象的技术规范。Adobe官方推出了Data Services 2,支持了AMF等功能,但是价格昂贵。在开源方面,PHP有专门支持的AmfPHP,另外WebORB同时支持.Net、Java、PHP、Ruby。

7 结束语

通过AMF协议,Flash可直接访问服务器端返回的数据类型,相比URLLoader返回的单一的String类型,大大节省了类型转换和格式化数据所耗费的大量时间。AMF采用二进制压缩,使得数据在传输时更加安全可靠。

参考文献:

[1] 孙颖.Flash ActionScript3殿堂之路[M].北京:电子工业出版社,2007.

[2] 林吓洪.ActionScript3.0编程精髓[M].北京:机械工业出版社,2008.