摘要:flash技术发展到今天,其语言经历过三个版本,从最简单的实现动画的跳转交互,到如今的大项目的开发。AMF的发展也经历过两个版本,从早期支持AS1.0和AS2.0的AMF0,到现在支持AS3.0的AMF3。该文详细论述了AMF的功能及数据处理过程,并实现简化AMF使用的自定义类。
关键词:FlashRemoting;AMF;EventDispatcher
UndertheAS3FlashRemotingCustomClassestoAchieve
XIONGHuan-yan,XUFang
(JiangxiModernPolytechnicCollege,Nanchang330012,China)
Abstract:Flashtechnologydevelopedtotoday,thelanguagewentthroughthreeversions,fromthesimplestrealizationofthejumpanimationinteractive,totoday’slargeprojectdevelopment.AMFdevelopmenthasalsogonethroughtwoversions,fromearlierAMF0supportAS1.0andAS2.0,tothepresentAMF3supportAS3.0.ThispaperdiscussesindetailthefunctionsofAMFanddataprocessing,andtheuseofsimplifiedAMFcustomclass.
Keywords:FlashRemoting;AMF;EventDispatcher
1FlashRemoting的核心技术:AMF
为了处理复杂数据类型,采用一种独有的方式使Flash与应用服务器间可以来回传送数据势在必行。于是AMF应运而生安装flash播放器。
AMF从早期的AMF0发展到现在的AMF3。AMF3用作AS3.0的默认序列化格式,而AMF0则用作旧版的AS1.0和2.0的序列化格式。在网络传输数据方面,AMF3比AMF0效率更高。AMF3能将int和uint对象作为整数(integer)传输,并且能序列化AS3.0才支持的数据类型,比如ByteArray,XML和IExternalizable等。
2AMF简介
AMF(ActionMessageFormat)是Adobe独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,它是基于http协议的轻量级数据交换协议,从而为Flash播放器与FlashRemoting网关通信提供了一种轻量级的、高效率的通信方式。
AMF可用于FlashRemoting、LocalConnection和FlashCommunicationServer,它最大的特色在于可直接将Flash的内置对象(如Object,Array,String等)传回服务器端,并且在服务器端自动进行解析成适当的对象(如Flash的数组传回PHP时就会自动转换为关联数组),这个特色对开发者最大的好处在于不再需要人工处理“序列化”与“反序列化”的繁复工作,不但精确度更高,同时开发也更省时间。
由于AMF是二进制格式并且编码时经过高度压缩,因此非常适合用来传递大量的资料,根据FlashORB网站的测试(主要针对WebService与FlashRemoting进行测试),当数据量越大时,FlashRemoting的传输效率就越高,远远超过WebService,至于XML、URLLoader,由于使用纯文本的传输方式,效率就更不能与FlashRemoting相提并论了。
3AMF内容处理过程
AMF的内容处理过程大致如下(如图1所示):
1)客户端以POST方式向服务器发送序列化请求数据流flash player 下载;
2)服务器端适配器对接收到的数据流进行反序列化,得到服务器端程序能够识别的数据,并建立一个响应(Response)消息;
3)Debug开始;
4)对反序化后的数据进行各种处理,并得到返回值;
5)对响应流进行序列化;
6)将响应数据流发送Http响应给客户端。
4FlashRemoting的应用
FlashRemoting的调用实现都基于flash.net.NetConnection类和flash.net.Responder类。其中NetConnection类可以调用远程应用程序服务器上的命令;Responder类提供了一个对象,该对象在NetConnection.call()中使用以处理来自与特定操作成功或失败相关的服务器的返回值,使用过程如下:
1)创建远程服务器的连接对象:
var_connection:NetConnection=newNetConnection();
2)创建服务器返回值的处理对象:
_responder=newResponder(onResultHandler,onFaultHandler);
其中:如果对服务器的调用成功并返回结果,则调用自定义函数onResultHandler
如果服务器返回一个错误,则调用自定义函数onFaultHandler
3)连接远程服务器网关:
_connection.connect(“amfphp/getway.php”);
connect()方法并不会立即连接网关URL,如果URL不合法或服务器发生异常,都不会收到错误,直到真正调用方法之后。
4)调用远程服务器上的命令
_connection.call(“classPath.method”,_responder,可选参数列表);
其中:第一个参数用点分隔符格式的路径的形式指定远程服务器的方法
第二个参数指定Responder对象,用于处理服务器的返回值
可选参数列表将若干可选参数传递给第一个参数所指定的方法
5)编写自定义函数onResultHandler和onFaultHandler,分别用来处理成功返回结果或返回一个错误。如下所示:
functiononResultHandler(resultData:*):void{
//resultData为调用成功后返回的结果,其数据类型为返回结果的类型
}
functiononFaultHandler(faultData:Object):void{
//faultData为调用失败后返回的错误对象
//其中faultData.description为调用失败后返回的错误信息
}
5FlashRemoting自定义类
从上述的实现过程来看,利用FlashRemoting调用远程服务器命令,每次都要创建NetConnection和Responder两个对象,并手动实现它们的连接,比较繁琐。为了使得利用FlashRemoting调用远程应用程序服务器上的命令更加方便实用,可创建一个自定义类对其进行封装,完整的实现程序如下:
编写好后,在程序中利用自定义类FlashRemoting调用远程服务器端命令的方法如下(以下以PHP的amfphp为例,实现调用PHP的HelloWorld类中的say方法):
6与后端集成
Flash是前端的界面技术,而后端和数据库交互或大型运算依然需要依托Java、.Net、PHP、Ruby等语言。早在FlashMX的时候Adobe就提出AMF技术,即将Java等语言的对象转换为ActionScript对象的技术规范。Adobe官方推出了DataServices2,支持了AMF等功能,但是价格昂贵。在开源方面,PHP有专门支持的AmfPHP,另外WebORB同时支持.Net、Java、PHP、Ruby。
7结束语
通过AMF协议,Flash可直接访问服务器端返回的数据类型,相比URLLoader返回的单一的String类型,大大节省了类型转换和格式化数据所耗费的大量时间。AMF采用二进制压缩,使得数据在传输时更加安全可靠。
关键词:FlashRemoting;AMF;EventDispatcher
UndertheAS3FlashRemotingCustomClassestoAchieve
XIONGHuan-yan,XUFang
(JiangxiModernPolytechnicCollege,Nanchang330012,China)
Abstract:Flashtechnologydevelopedtotoday,thelanguagewentthroughthreeversions,fromthesimplestrealizationofthejumpanimationinteractive,totoday’slargeprojectdevelopment.AMFdevelopmenthasalsogonethroughtwoversions,fromearlierAMF0supportAS1.0andAS2.0,tothepresentAMF3supportAS3.0.ThispaperdiscussesindetailthefunctionsofAMFanddataprocessing,andtheuseofsimplifiedAMFcustomclass.
Keywords:FlashRemoting;AMF;EventDispatcher
1FlashRemoting的核心技术:AMF
为了处理复杂数据类型,采用一种独有的方式使Flash与应用服务器间可以来回传送数据势在必行。于是AMF应运而生安装flash播放器。
AMF从早期的AMF0发展到现在的AMF3。AMF3用作AS3.0的默认序列化格式,而AMF0则用作旧版的AS1.0和2.0的序列化格式。在网络传输数据方面,AMF3比AMF0效率更高。AMF3能将int和uint对象作为整数(integer)传输,并且能序列化AS3.0才支持的数据类型,比如ByteArray,XML和IExternalizable等。
2AMF简介
AMF(ActionMessageFormat)是Adobe独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,它是基于http协议的轻量级数据交换协议,从而为Flash播放器与FlashRemoting网关通信提供了一种轻量级的、高效率的通信方式。
AMF可用于FlashRemoting、LocalConnection和FlashCommunicationServer,它最大的特色在于可直接将Flash的内置对象(如Object,Array,String等)传回服务器端,并且在服务器端自动进行解析成适当的对象(如Flash的数组传回PHP时就会自动转换为关联数组),这个特色对开发者最大的好处在于不再需要人工处理“序列化”与“反序列化”的繁复工作,不但精确度更高,同时开发也更省时间。
由于AMF是二进制格式并且编码时经过高度压缩,因此非常适合用来传递大量的资料,根据FlashORB网站的测试(主要针对WebService与FlashRemoting进行测试),当数据量越大时,FlashRemoting的传输效率就越高,远远超过WebService,至于XML、URLLoader,由于使用纯文本的传输方式,效率就更不能与FlashRemoting相提并论了。
3AMF内容处理过程
AMF的内容处理过程大致如下(如图1所示):
1)客户端以POST方式向服务器发送序列化请求数据流flash player 下载;
2)服务器端适配器对接收到的数据流进行反序列化,得到服务器端程序能够识别的数据,并建立一个响应(Response)消息;
3)Debug开始;
4)对反序化后的数据进行各种处理,并得到返回值;
5)对响应流进行序列化;
6)将响应数据流发送Http响应给客户端。
4FlashRemoting的应用
FlashRemoting的调用实现都基于flash.net.NetConnection类和flash.net.Responder类。其中NetConnection类可以调用远程应用程序服务器上的命令;Responder类提供了一个对象,该对象在NetConnection.call()中使用以处理来自与特定操作成功或失败相关的服务器的返回值,使用过程如下:
1)创建远程服务器的连接对象:
var_connection:NetConnection=newNetConnection();
2)创建服务器返回值的处理对象:
_responder=newResponder(onResultHandler,onFaultHandler);
其中:如果对服务器的调用成功并返回结果,则调用自定义函数onResultHandler
如果服务器返回一个错误,则调用自定义函数onFaultHandler
3)连接远程服务器网关:
_connection.connect(“amfphp/getway.php”);
connect()方法并不会立即连接网关URL,如果URL不合法或服务器发生异常,都不会收到错误,直到真正调用方法之后。
4)调用远程服务器上的命令
_connection.call(“classPath.method”,_responder,可选参数列表);
其中:第一个参数用点分隔符格式的路径的形式指定远程服务器的方法
第二个参数指定Responder对象,用于处理服务器的返回值
可选参数列表将若干可选参数传递给第一个参数所指定的方法
5)编写自定义函数onResultHandler和onFaultHandler,分别用来处理成功返回结果或返回一个错误。如下所示:
functiononResultHandler(resultData:*):void{
//resultData为调用成功后返回的结果,其数据类型为返回结果的类型
}
functiononFaultHandler(faultData:Object):void{
//faultData为调用失败后返回的错误对象
//其中faultData.description为调用失败后返回的错误信息
}
5FlashRemoting自定义类
从上述的实现过程来看,利用FlashRemoting调用远程服务器命令,每次都要创建NetConnection和Responder两个对象,并手动实现它们的连接,比较繁琐。为了使得利用FlashRemoting调用远程应用程序服务器上的命令更加方便实用,可创建一个自定义类对其进行封装,完整的实现程序如下:
package {
import flash.net.NetConnection;
import flash.net.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(NetStatusEvent.NET_STATUS,nsHandler);
}
//调用远程服务器上的命令,第一个参数为服务器命令名,
//后面若干可选参数为传递给服务器命令的参数
public function call(classFunc:String, args):void {
var parameters:Array = args;
parameters.unshift(classFunc,_responder);
_conn.call.apply(this,parameters);
}
//(只读属性)获取调用远程服务器命令成功后的返回值
public function getdata():* {
return _data;
}
//调用成功后接收返回值,并调度Event.COMPLETE事件
private function onResultHandler(resultData:*):void {
_data = resultData;
var tmpEvt:Event = new Event(Event.COMPLETE);
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(evt.info.code);
}
}
}
编写好后,在程序中利用自定义类FlashRemoting调用远程服务器端命令的方法如下(以下以PHP的amfphp为例,实现调用PHP的HelloWorld类中的say方法):
var fr:FlashRemoting = new FlashRemoting("amfphp/gateway.php");
fr.addEventListener(Event.COMPLETE,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等语言。早在FlashMX的时候Adobe就提出AMF技术,即将Java等语言的对象转换为ActionScript对象的技术规范。Adobe官方推出了DataServices2,支持了AMF等功能,但是价格昂贵。在开源方面,PHP有专门支持的AmfPHP,另外WebORB同时支持.Net、Java、PHP、Ruby。
7结束语
通过AMF协议,Flash可直接访问服务器端返回的数据类型,相比URLLoader返回的单一的String类型,大大节省了类型转换和格式化数据所耗费的大量时间。AMF采用二进制压缩,使得数据在传输时更加安全可靠。