AS3下Flash Remoting自定义类的实现

来源:互联网 发布:淘宝付款时默认银行卡 编辑:程序博客网 时间:2024/06/06 11:46
  摘要: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调用远程应用程序服务器上的命令更加方便实用,可创建一个自定义类对其进行封装,完整的实现程序如下:
  
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采用二进制压缩,使得数据在传输时更加安全可靠。