`

AS AMF说明比较好的一篇

    博客分类:
  • flex
阅读更多

原文 http://www.pixelbender.cn/?p=272

 

AMF是Action Message Format协议的简称,AMF协议是Adobe公司自己的协议,主要用于数据交互和远程过程调用,在功能上相当于WebService,但是AMF与 WebService中的XML不同的是AMF是二进制数据,而XML是文本数据,AMF的传输效率比XML高。AMF使用HTTP方式传输,目前主要是 用于ActionScript中,即实现Flex和Server之间的通信。

我是做.Net开发的,按理说和AMF没有什么关系,主要是最近在耍一款网页游戏:纵横天下,该游戏就是采用Flex做的客户端,为了能够做出该游 戏的挂机程序,所以才开始学习研究AMF的。闲话休说,言归正传,下面继续说AMF协议,在例子中我使用的AMF数据就是从纵横天下中抓取的AMF数据。

AMF目前有两种版本,AMF0和AMF3,他们在数据类型的定义上有细微不同。关于AMF的官方文档参见这里

Type Byte code Notes
Number 0×00
Boolean 0×01
String 0×02
Object 0×03
MovieClip 0×04 Not available in Remoting
Null 0×05
Undefined 0×06
Reference 0×07
MixedArray 0×08
EndOfObject 0×09 See Object
Array 0x0a
Date 0x0b
LongString 0x0c
Unsupported 0x0d
Recordset 0x0e Remoting, server-to-client only
XML 0x0f
TypedObject (Class instance) 0×10
AMF3 data 0×11 Sent by Flash player 9+
对应的枚举就是
public   enum  DataType
{
   Number 
=   0 ,
   Boolean 
=   1 ,
   String 
=   2 ,
   UntypedObject 
=   3 ,
   MovieClip 
=   4 ,
   Null 
=   5 ,
   Undefined 
=   6 ,
   ReferencedObject 
=   7 ,
   MixedArray 
=   8 ,
   End 
=   9 ,
   Array 
=   10 , // 0x0A
   Date  =   11 , // 0x0B
   LongString  =   12 , // 0x0C
   TypeAsObject  =   13 , // 0x0D
   Recordset  =   14 , // 0x0E
   Xml  =   15 , // 0x0F
   TypedObject  =   16 , // 0x10
   AMF3data = 17 // 0x11
}


以上表列出了每种数据类型的表示方法,这样看并不容易理解,下面我就主要讲解一下常用的一些格式:
0.Number这里指的是double类型,数据用8字节表示,比如十六进制00 40 10 00 00 00 00 00 00就表示的是一个double数4.0,在C#中可以使用如下代码读取该数据:
byte [] d = new   byte []{ 0 , 0 , 0 , 0 , 0 , 0 , 0x10 , 0x40 }; // 这里的顺序是和amf文件中的顺序正好相反,不要忘记了
     double  num = BitConverter.ToDouble(d, 0 ); 
1.Boolean对应的是.net中的bool类型,数据使用1字节表示,和C语言差不多,使用00表示false,使用01表示true。比如十六进制01 01就表示true。
2.String相当于.net中的string类型,String所占用的空间有1个类型标识字节和2个表示字符串UTF8长度的字节加上字符串UTF8格式的内容组成。比如十六进制03 00 08 73 68 61 6E 67 67 75 61表示的就是字符串,该字符串长8字节,字符串内容为73 68 61 6E 67 67 75 61,对应的就是“shanggua”。在C#中要读取字符串则使用:
byte [] buffer = new   byte []{ 0x73 , 0x68 , 0x61 , 0x6E , 0x67 , 0x67 , 0x75 , 0x61 }; // 03 00 08 73 68 61 6E 67 67 75 61
     string  str = System.Text.Encoding.UTF8.GetString(buffer);

3.Object在.net中对应的就是Hashtable,内容由UTF8字符串作为Key,其他AMF类型作为Value,该对象由3个字节:00 00 09来表示结束。C#中读取该对象使用如下方法:
private  Hashtable ReadUntypedObject()
      
{
         Hashtable hash 
=   new  Hashtable();
         
string  key  =  ReadShortString();
         
for  ( byte  type  =  ReadByte(); type  !=   9 ; type  =  ReadByte())
         
{
            hash.Add(key, ReadData(type));
            key 
=  ReadShortString();
         }

         
return  hash;
      }
 

5.Null就是空对象,该对象只占用一个字节,那就是Null对象标识0x05。
6. Undefined 也是只占用一个字节0x06。
8.MixedArray相当于Hashtable,与3不同的是该对象定义了Hashtable的大小。读取该对象的C#代码是:

 

private  Hashtable ReadDictionary()
      
{
         
int  size  =  ReadInt32();
         Hashtable hash 
=   new  Hashtable(size);
         
string  key  =  ReadShortString();
         
for  ( byte  type  =  ReadByte(); type  !=   9 ; type  =  ReadByte())
         
{
            
object  value  =  ReadData(type);
            hash.Add(key, value);
            key 
=  ReadShortString();
         }

         
return  hash;
      }
 

10.Array对应的就是.net中的ArrayList对象,该对象首先使用32位整数定义了ArralyList的长度,然后是密集的跟着ArrayList中的对象,读取该对象使用如下函数:

private  ArrayList ReadArray()
      
{
         
int  size  =  ReadInt32();
         ArrayList arr 
=   new  ArrayList(size);
         
for  ( int  i  =   0 ; i  <  size;  ++ i)
         
{
            arr.Add(ReadData(ReadByte()));
         }

         
return  arr;
      }
 

11.Date对应.net中的DateTime数据类型,Date在类型标识符0x0B后使用double来表示从1970/1/1到表示的时间所经过的毫秒数,然后再跟一个ushort的16位无符号整数表示时区。读取Date类型的C#代码为:

 

private  DateTime ReadDate()
     
{
        
double  ms  =  ReadDouble();
        DateTime BaseDate 
=   new  DateTime( 1970 1 1 );
        DateTime date 
=  BaseDate.AddMilliseconds(ms);         
        ReadUInt16(); 
// get's the timezone         
         return  date;
     }
 

12.LongString对应的也是string类型,不过和2对应的String不同的是这里使用32位整数来表示字符串的UTF8长度,而String使用的是16位。

15.XML是使用类型标识符0x0F后直接跟LongString类型的字符串表示。

这里大部分代码我都是摘自AMF.net 一个开源的.net AMF序列化和反序列化的库,大家若有兴趣可以到http://sourceforge.net/project/showfiles.php?group_id=159742 去下载。另外http://osflash.org/documentation/amf/astypes 这个英文网站也对AMF数据类型作了比较详细的介绍。
------------------------------------------

前一篇文章 中已经学习了AMF数据类型,那么接下来就要将一个完整的AMF文件的封装格式了。

AMF文件总体来说分为4部分:前言(Preamble )、AMF头、AMF主体和主体的响应。

前言的前2字节用于说明AMF的版本,目前AMF有2个版本AMF0和AMF3.如使用AMF0则是:00 00

第3和第4字节用16位整数表示AMF头的数量。

每一个AMF头是由以下四部分组成:

  • UTF string 表示Header的名字

  • Boolean 表示该Header是否是必须的

  • Int32表示Header的长度,但是好像很多情况下该值为FF FF FF FF,似乎这个字段没有意义。

  • Variable变量是某种AMF数据类型。

    在Header表示完后,接下来是一个16位的整数用来表示AMF主体的数量,在这个数量之后才是AMF主体。

    AMF主体主要由以下四部分组成:

  • UTF String - Response表示请求的类和方法或响应的结果。

  • UTF String - Target是一个标识,其作用就是为了实现请求和响应的对应,通过Target找到该响应对应的请求。一般使用自增整数。

  • Int32- 表示主体的长度,该字段一般没有什么用

  • Variable变量表示主体的数据。

    主体响应是客户端向服务器发送一个AMF请求以后服务器做出的和请求的主体格式相同的AMF响应,但是主体响应中的内容有所不同:

  • Response: 被设置为字符串‘null’.

  • Target: 是请求的Target值再加上“/onStatus”, “onResult”, 或者 “/onDebugEvents”组成. “/onStatus” 是为运行时错误而准备的我们一般不关心这个. “/onResult” 表示该请求被正确调用. “/onDebugEvents” 是在调试时使用的,这里也不用关心. 如果请求的Target是‘/1’, 那么被成功调用以后的主体响应应该是: ‘/1/onResult’ 。

  • Data:就是响应后返回的AMF对象。

    说了这么多估计还是感觉比较抽象,下面给出个实例:

    AMF 16进制内容

    00000000h: 00 00 00 00 00 01 00 1B 7A 68 2E 66 6C 65 65 74 ; ........zh.fleet
    00000010h: 53 65 72 76 69 63 65 2E 67 65 74 46 6C 65 65 74 ; Service.getFleet
    00000020h: 52 6F 77
    00 03 2F 37 39 00 00 00 13 0A 00 00 00 ; Row../79........
    00000030h: 03
    02 00 01 35 02 00 03 38 34 35 02 00 01 35       ; ....5...845...5

    以上是客户端向服务器发送的一个AMF请求。我们可以按照前面说的封装方式将该amf解析如下:

    00 00(AMF0版本)00 00(Header个数为0)00 01(AMF主体有1个)

    00 1B(请求的方法的字符串长度为27个字节)

    7A ……77(这27个直接就是调用的类和方法:“zh.fleetService.getFleetRow”)

    00 03(请求的Target字符串长3字节) 2F 37 39(Target的内容:“/79”)

    00 00 00 13(主体的长度为19)

    0A(传入的变量是一个Array)00 00 00 03(该Array的长度为3)02 00 01 35(Array的第一个值是字符串“5”)02 00 03 38 34 35(Array的第二个值是字符串“845”)02 00 01 35(Array的第三个值是字符串“5”)

    现在整个AMF对象都解析出来了,我们可以认为是客户端调用了服务器的方法:zh.fleetService.getFleetRow("5", "845", "5")

    服务器返回的AMF文件的内容的解析方式相同,这里我就不再重复了。

    现在我们已经对AMF文件有了一个清晰的认识了。那么接下来就是要抓包,看某些在Flex上的操作对应的发送了什么AMF文件,服务器返回了什么AMF文件。将这些AMF文件解析出来然后就可以看到调用了API了。

    【出自博客园深蓝居 ,转载请注明作者出处】
  •  

    分享到:
    评论

    相关推荐

      AMF-1.4.33.zip

      AMF-1.4.33.zip文件可能是AMF的一个特定版本的实现,包含了所有必要的组件和资源,帮助开发者更好地利用这一技术。如果你正在使用Flex、Flash或其他支持AMF的平台,这个更新可能会对你的项目带来性能提升和功能增强...

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

      AMF.NET是一个小型而高效的开源库,专门用于处理Action Message Format (AMF)数据流。AMF是一种二进制的数据交换格式,常用于Flash、Flex和Adobe AIR等技术中的远程方法调用(RPC)和数据传输。FluorineFx是另一个...

      AMF数据分析器_V22

      支持AS3的ByteArray序列化对象的AMF格式编码、解码( readObject、writeObject )。 支持AS3的ByteArray的compress、uncompress压缩算法:DEFLATE、LZIB、LZMA。 支持直接修改AS3的ByteArray字节流内编码的对象。 ...

      AMF1.0(AMP).zip

      AMF,全称为Action Message Format,是一种数据序列化协议,主要在Adobe的Flex、Flash Player以及服务器端技术如Adobe LiveCycle Data Services等中使用。它允许应用程序之间高效地传输复杂的数据结构,包括对象、...

      amf3协议解析的例子

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

      AMF3 C++ 源码库码库

      AMF3(Action Message Format version 3)是Adobe公司开发的一种二进制数据序列化格式,主要用于Flash Player和Flex应用程序与服务器之间的数据交换。在C++编程环境中,AMF3库可以帮助开发者高效地处理这种数据格式...

      amf3_spec_05_05_08.zip_AMF3_above flash player_player

      在文件列表中,我们看到一个名为“amf3_spec_05_05_08.pdf”的文档,这很可能是AMF3规范的详细说明,包含了AMF3的编码规则、解码过程、数据类型的映射以及如何在Flash Player中使用AMF3进行通信的详细信息。...

      amf.zip_AMF_amf_python

      4. **优化性能**:AMF3的引入是为了提高数据传输效率,因此一个好的AMF库应该能够利用AMF3的特性,如压缩和优化数据表示,来提高解析和序列化的速度。 5. **自定义类型支持**:允许用户注册自定义的Python类,并...

      amf0 原版文档 完整版

      AMF0,全称为Action Message Format 0,是Adobe Flex框架中的一个数据序列化协议,用于在...通过深入阅读《amf0_spec_121207.pdf》文档,开发者可以更好地理解AMF0的工作原理,并利用这一特性优化他们的应用性能。

      开源amf协议解析封装

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

      AMF编码解码演示版

      AMF有两种主要的版本:AMF0和AMF3,其中AMF3提供了更好的压缩和性能。 AMF解码则是将接收到的二进制数据还原成原始的对象或数据结构,这一过程对于正确解析服务器返回的信息至关重要。易语言类库提供的AMF编码解码...

      AMF数据分析器

      AMF(Action Message Format)是一种数据交换格式,主要用于Flash与服务器之间的通信,尤其在Adobe Flex应用中广泛应用。AMF数据分析器是一款专为处理和解析AMF数据而设计的专业工具,旨在提升开发人员对AMF数据的...

      AMF抓取flex页面数据

      - AMF分为两种类型:AMF0和AMF3,其中AMF3提供了更好的压缩和性能。 2. **Flex与AMF通信** - Flex应用通常通过HTTP/HTTPS与服务器通信,使用AMF协议封装数据,通过Flash Player发送到服务器。这些请求可能包括...

      AMF.rar_FluorineFx_FluorineFx amf_amf__flex_flex amf

      标题中的"AMF.rar_FluorineFx_FluorineFx amf_amf__flex_flex amf"表明这是一个关于AMF(Action Message Format)技术的压缩包,其中包含了FluorineFx的相关资料。FluorineFx是.NET平台上开源的Adobe Flash Remoting...

      lua-amf 解析库

      Lua-Amf 是一个专为 Lua 语言设计的AMF(Action Message Format)解析库,它使得在 Lua 环境中处理AMF3格式的数据变得简单高效。AMF是一种二进制序列化格式,常用于Flash与服务器之间的数据交换,如Adobe的Flex和...

      AMF3协议中文版定义.pdf

      AMF(Action Message Format,动作信息格式)是一种压缩的二进制格式,用于序列化 ActionScript 对象图。序列化后的 AMF 编码对象图可以用来持久化,并在不同的会话中获得应用的公共状态,或者允许在两个端点(如...

      amf解析,json解析 格式化

      AMF(Action Message Format)是Adobe公司开发的一种二进制数据序列化格式,常用于Flash与服务器之间的数据交换。AMF格式提供了高效的数据传输,它能够将复杂的数据结构如对象、数组、日期等编码为二进制流,从而...

      amf3cplusplus

      AMF3(Action Message Format version 3)是Adobe公司开发的一种二进制数据序列化格式,主要用于Flash Player与服务器之间的数据交换。它提高了数据传输效率,支持多种数据类型,包括基本类型、对象、数组、日期等。...

      amf解析构造易语言源码

      但是,如果你选择自己实现,这将是一个很好的学习机会,可以深入理解AMF协议以及易语言的编程机制。 最后,文件名"amf解析构造易语言源码.e"表明你可能已经得到了一个包含易语言源代码的项目文件。打开这个文件,你...

      AMF3 C++ 源码(修改版)

      AMF3,全称为Action Message Format 3,是Adobe公司为Flash Player和Flex应用程序之间进行数据交换设计的一种高效二进制序列化格式。这个“AMF3 C++ 源码(修改版)”提供了对AMF3协议的C++实现,支持序列化和对象化...

    Global site tag (gtag.js) - Google Analytics