`

[转] Amf通信类

阅读更多
package applications.amfExample
{
    import flash.events.NetStatusEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.NetConnection;
    import flash.net.ObjectEncoding;
    import flash.net.Responder;

    public class Amf
    {
        private static var conn:NetConnection = new NetConnection();
        private static var requests:Array = new Array();
        private static var netStatusError:Boolean = false;
        private static var netStatusErrorMessage:String = "";
        private static var netStatusErrorFunction:Function = null;
        private static var resultFunction:Function = null;
        private static var retry:int = 0;
        private static var retried:int = 0;

        /*
         * Initialize AMF connection
         * @conString:Server IP Address
         * @retryNumber:Connection retried number on connect error
         */
        public static function ini(conString:String, retryNumber:Number = 0, onErrorFunction:Function = null, onResultFunction:Function = null):void
        {
            conn.objectEncoding = ObjectEncoding.AMF3;
            conn.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            conn.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
           // Debug.info('[AMF] Connected to server : ' + conString);
            conn.connect(conString);
            retry = retryNumber;
            resultFunction = onResultFunction;
            netStatusErrorFunction = onErrorFunction;
        }

        public static function call(remoteFunction:String, localFunction:Function = null, object:Object = null):Number
        {
            if (null == object)object = new Object();
            var request:Object = new Object();
            request.remoteFunction = remoteFunction;
            request.localFunction = localFunction != null ? localFunction : resultFunction;
            request.object = object;
            requests.push(request);
            if (requests.length == 1)checkRequests();
            return requests.length;
        }

        public static function checkRequests():void
        {
            if (requests.length > 0)
            {
                    //Debug.info('[AMF] Amf call : ' + requests[0].remoteFunction);
                    conn.call(requests[0].remoteFunction, new Responder(onResult, onfault), requests[0].object);
            }
        }

        private static function netStatusHandler(event:NetStatusEvent):void
        {
            if (retry > retried)
            {
                retried++;
                checkRequests();
            }
            else
            {
                netStatusErrorMessage = event.info.code + ":" + requests[0].remoteFunction + "=>retried:" + retried;
                onError();
            }
        }

        private static function securityErrorHandler(event:SecurityErrorEvent):void
        {
            netStatusErrorMessage = "ERROR: SecurityErrorHandler: " + event;
            onError();
        }

        private static function onResult(obj:Object):void
        {
                //Debug.info('[AMF] Amf callback : ' + requests[0].remoteFunction);
                if(null == obj) obj = new Object();
                try
                {
                                if( undefined == obj.dataType) obj.dataType = requests[0].remoteFunction;                        
                }
                catch(e:Error)
                {
                        netStatusErrorMessage = 'WARNING : There is no [dataType] after called on ' + requests[0].remoteFunction;
                        onError();
                }
            if (null != requests[0].localFunction)((requests[0].localFunction) as Function).call(requests[0].localFunction, obj);
            netStatusError = false;
            netStatusErrorMessage = "";
            retried = 0;
            requests.shift();
            checkRequests();
        }

        private static function onfault(obj:Object):void
        {
            //netStatusErrorMessage = obj.toString();
            netStatusErrorMessage = "ERROR: Server may not support *"+requests[0].remoteFunction + "*";
            onError();
        }

        private static function onError():void
        {
            netStatusError = true;
            if (null != netStatusErrorFunction)netStatusErrorFunction.call(netStatusErrorFunction, netStatusErrorMessage);
          //  Debug.info('[AMF] ' + netStatusErrorMessage);
        }

        public static function get con():NetConnection
        { //获取链接
            return conn;
        }

        public static function close():void
        { //关闭链接
            conn.close();
        }

        public static function getNetStatusErrorMessage():String
        { //获取错误信息
            return netStatusErrorMessage;
        }

        public static function getNetStatusError():Boolean
        { //获取错误状态
            return netStatusError;
        }

    }
}
分享到:
评论

相关推荐

    AMF.NET 文件极小的开源AMF解析库

    对于那些需要在旧系统上进行AMF通信的开发者来说,这是一个非常有价值的特性,因为许多较新的库可能只支持.NET Framework的更新版本。 AMF有多种版本,包括AMF0和AMF3,AMF.NET应该支持这两种格式,以适应不同场景...

    基于AMF的Android数据通信.pdf

    基于AMF的Android数据通信 ...基于AMF通信 FLASH技术设计康复古籍检索平台[J]. 电脑开发与应用, 2012, 25(7). [4]吕海东.基于Flex和BlazeDS推技术实现WEB方式实时监控系统[J]. 计算机应用, 2010, 29(1).

    amf3_spec_05_05_08.zip_AMF3_above flash player_player

    在AMF3中,数据被编码为二进制流,支持多种数据类型,包括基本类型(如整型、浮点型、字符串、布尔值)、复杂类型(如对象、数组、日期、null、undefined)以及自定义类实例。这种二进制编码使得数据在网络上传输时...

    AMF.rar_FluorineFx_FluorineFx amf_amf__flex_flex amf

    描述中的“Flex AMF通讯,主要用于初学者配置FluorineFx.net服务端”说明了这个压缩包的主要用途,即帮助初学者了解如何在FluorineFx.NET环境中配置AMF通信。这通常涉及以下步骤: 1. **安装FluorineFx**: 下载并...

    AMF1.0(AMP).zip

    在Flex应用中,可以使用 BlazeDS 或 GraniteDS 这样的中间件来处理AMF通信。 总的来说,AMF1.0作为早期的AMF版本,为RIA开发提供了一种高效的数据交换方式,尽管现在已经被更先进的版本所替代,但在某些老项目或...

    AMF抓取flex页面数据

    2. **Flex与AMF通信** - Flex应用通常通过HTTP/HTTPS与服务器通信,使用AMF协议封装数据,通过Flash Player发送到服务器。这些请求可能包括服务调用、事件处理等。 3. **抓取AMF数据** - 抓取AMF数据需要特殊工具...

    amf3协议解析的例子

    AMF3(Action Message Format version 3)协议是Adobe公司为Flash Player和Flex应用程序之间通信设计的一种二进制数据交换格式。它旨在提高数据传输效率,同时保持足够的灵活性以适应不同类型的复杂数据结构。AMF3...

    zend_amf与actionscript通信的实例

    此实例完成了一个最简单的zend_amf与actionscript通信的流程。具体开发说明可参照此网址。http://blog.csdn.net/A82168506/archive/2011/04/27/6366667.aspx

    thinkphp_amf

    2. **Client** - 这可能是Flex客户端项目的源代码目录,包含ActionScript类和界面组件,用于与服务器进行AMF通信。在Flex中,我们可以使用Flash Remoting来实现AMF,通过创建RemoteObject或 BlazeDS服务来调用服务器...

    AMF数据分析器_V22

    支持AMF格式的通信封包编码、解码、向AMF服务端发送请求、返回AMF数据解析。 支持RTMP封包编码、解码。 支持Flex外部化类的AMF编码、解码。 支持解压还原LZMA算法压缩过的SWF文件(文件头三字节为:ZWS的 *.SWF...

    AMF数据分析器

    AMF(Action Message Format)是一种数据交换...这对于调试Flex应用或基于AMF通信的系统来说是极其重要的。通过这款工具,开发流程可以变得更加高效,节省了手动解析和验证AMF数据的时间,从而提升整体项目开发效率。

    AMF3 C++ 源码库码库

    在C++编程环境中,AMF3库可以帮助开发者高效地处理这种数据格式,使得网络通信更加便捷。下面我们将详细探讨AMF3在C++中的实现以及源码库的相关知识点。 AMF3的核心功能在于能够将复杂的数据结构(如对象、数组、...

    amf.zip_AMF_amf_python

    AMF,全称为Action Message Format,是一种二进制的数据交换格式,主要被Adobe Flex和Flash Player用于服务器与客户端之间的通信。在Python中,处理AMF数据通常需要借助特定的库,这里提到的"amf.zip_AMF_amf_python...

    amf解析构造.rar

    易语言AMF解析构造的源码,可以作为学习AMF通信和易语言编程的实战案例。通过阅读和理解代码,开发者可以掌握如何在易语言环境中进行二进制数据的读写,以及如何处理AMF数据的编码和解码流程。此外,这也为开发基于...

    AMF3协议中文版定义.pdf

    序列化后的 AMF 编码对象图可以用来持久化,并在不同的会话中获得应用的公共状态,或者允许在两个端点(如客户端和服务器端)通过强类型数据交换进行通信。 AMF 的历史可以追溯到 2001 年的 Flash Player 6,当时它...

    AMF3 C++ 源码(修改版)

    2. **数据类型支持**:AMF3支持多种数据类型,包括整型、浮点型、字符串、日期、数组、对象等,同时还有自定义类的支持,使得它可以处理复杂的数据结构。 3. **序列化与反序列化**:源码中的序列化功能允许将C++...

    开源amf协议解析封装

    AMF是一种高效的数据交换格式,常用于Adobe Flex和Adobe Flash Player与服务器之间的通信,它能快速序列化和反序列化数据,提高Web服务的性能。 AMF的核心特点包括: 1. **高效性**:相比于XML或其他文本格式,AMF...

    lua-amf 解析库

    AMF3可以处理各种类型的数据,包括基本类型(如字符串、数字、布尔值)、复杂类型(如对象、数组、日期、XML)以及自定义类。 2. **Lua-Amf功能**:这个库主要提供两个核心功能——AMF数据的解析(Deserialization...

    AMF编码解码演示版

    在实际应用中,AMF常用于游戏服务器通信、实时数据交换、富互联网应用(RIA)等场景。理解并掌握AMF编码解码不仅有助于优化数据传输,还能提升应用程序的性能。通过这个易语言的AMF编码解码演示版,开发者能够深入...

    amf0 原版文档 完整版

    6. **兼容性**:AMF0是Adobe Flash Player和Flex SDK之间的标准通信协议,但也有第三方库支持其他平台的AMF0实现,如Python、Java和PHP等。 7. **安全性**:虽然AMF0提供了高效的传输方式,但它并不提供内置的安全...

Global site tag (gtag.js) - Google Analytics