标点符(钱魏 Way)

网络传输协议AMF初探

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

AMF最大的特色在于可直接将Flash内置对象,例如Object, Array, Date, XML,传回服务器端,并且在服务器端自动进行解析成适当的对象,这就减轻了开发人员繁复工作,同时也更省了开发时间。目前支持的数据类型在AMF协议中对应的值是:

  • Number 0x00;
  • Boolean 0x01;
  • String 0x02;
  • Object 0x03;
  • MovieClip 0x04;
  • Null 0x05;
  • Undefined 0x06;
  • Reference 0x07;
  • ECMAArray 0x08;
  • ObjectEnd 0x09;
  • StrictArray 0x0a;
  • Date 0x0b;
  • LongString 0x0c;
  • Unsupported 0x0d;
  • Recordset 0x0e;
  • XMLObject 0x0f;
  • TypedObject(Class) 0x10;

AMF协议是基于Http协议的,它的内容处理过程大致是这样:

  1. 从客户端获取Http请求(Request)流;
  2. 对流进行解串行化(Deserialize),得到服务器端程序能够识别的数据,并建立一个响应(Response)消息;
  3. Debug开始;
  4. 对流进行各种处理(记录、许可、服务)得到返回值;
  5. 对响应流进行串行化;
  6. 发送Http响应给客户端;

同样是轻量级数据交换协议,同样是通过调用远程服务,同样是基于标准的HTTP和HTTPS协议,Flash Remoting为什么选择了使用AMF而放弃了SOAP与Flash播放器通信有如下原因:

  1. SOAP将数据处理成XML格式,相对于二进制的AFM太冗长了;
  2. AMF能更有效序列化数据;
  3. 因为AMF协议的初衷只是为了支持Flash ActionScript的数据类型,而SOAP却致力于提供更广泛的用途;
  4. 在对Flash Player 6 的浏览器支持上AMF只需要4KB左右(压缩后)的大小,而SOAP就大多了;
  5. SOAP的一些头部文件请求在Flash Player 6 不支持.

由于AMF采用二进制编码,这种方式可以高度压缩数据,因此非常适合用来传递大量的资料。数据量越大,Flash Remoting的传输效能就越高,远远超过Web Service。至于XML,它使用纯文本的传输方式,效能就更不能与Flash Remoting相提并论了。

介绍到这里应该还不清楚Flash如何通过AMF与数据库进行通信。具体的流程为:

Flash(*.swf) <–> Server端程序(PHP,ASP.NET,Java,Python,Ruby..etc) <–> DB

对于AMP,目前各种程序语言基本上都已经有了现成的框架,如PHP有AMFPHP/Zend_Amf,.NET有FluorineFx,Python有PyAMF,Ruby有RubyAMF。不管是哪种语言,流程上都差不多:

  1. SWF连上指定的Gateway;
  2. 请求Gateway上的service,并把所需的参数以AMF格式传给它;
  3. 将执行结果回传。

其他参考资料:http://en.wikipedia.org/wiki/Action_Message_Format

码字很辛苦,转载请注明来自标点符《网络传输协议AMF初探》

评论