amfphp教程系列之认识amf协议
action message format(amf)
amf是一个松散的基于soap(simple object access protocol,简单对象访问协议)的二进制格式。它主要用于在adobe flash应用程序和数据库之间交换数据通过rpc(远程过程调用).
每条amf消息都含有一个主体含有错误和响应,它们被表达成一个as对象。
amf是flash player6引入的,该版本被引用为amf0.直到flash player9和as3.0(此时新的数据类型和语言样式使得产生一个更新称作amf3)一直没有改动。
data types数据类型
amf包含几个核心数据类型,它们总是存在于数据序列化的始终:
byte-----一个简单的8位数据。这是最简单的传送数据方式。
int--------一个16位的数字由2个连续字节组成。第一个字节较重要,第二个字节次重要。
mediumint-----一个24位的数字类似上面的,仅仅长度的差别。
long------一个32位的数字,同上,但更长。
double---一个64位数字由8个连续的字节构成。代表一个浮点数有符号数字。double是按little-endian(低字节在后面?译者不确定呵呵)编码的。
utf8---一个utf8字符串长度小于2^16(65536)字节。它由一个整数(2个字节)表示字符串的长度,后面跟着utf-8编码的字符串。
longutf8---一个utf8字符串可能长于2^16字节。它由一个长整数(4字节)表示字符串长度,后面跟着utf8编码字符串。
?
flash 5开始就可以以xml或者“变量/值”配对输出格式向服务器传送数据。虽然这些数据能通过flash编译器自动解析或者通过开发人员自行编写的代码手动解析, 但解析的速度慢。因为在解析过程中,xml需要按节点逐层处理数据。而且使用xml和“变量/值”配对格式处理的数据类型只能是字符型,数字也不例外。而flash remoting却能处理复杂数据类型, 比如对象、结构、数组,甚至可以是数据集,配合datagrid组件可以很方便地显示数据。
为了处理复杂数据类型,采用一种独有的方式使flash与应用服务器间可以来回传送数据势在必行。于是amf应运而生。amf是adobe独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,从而为flash 播放器与flash remoting网关通信提供了一种轻量级的、高效能的通信方式。如下图所示。
amf最大的特色在于可直接将flash内置对象,例如object, array, date,xml,传回服务器端,并且在服务器端自动进行解析成适当的对象,这就减轻了开发人员繁复工作,同时也更省了开发时间。由于amf采用二进制编码,这种方式可以高度压缩数据,因此非常适合用来传递大量的资料。数据量越大,flash remoting的传输效能就越高,远远超过webservice。至于xml, loadvars和loadvariables() ,它们使用纯文本的传输方式,效能就更不能与flash remoting相提并论了。
注意:flash remoting需要浏览器支持bin ary post,flash 播放器在nets cape 6.x.环境下运行flash remoting会不起作用(flash remoting调用没有效果也不返回错误), nets cape 7已经纠正了这个b u g 。对于早期sa fari和chim era版的苹果机也有这个问题。
同样是轻量级数据交换协议,同样是通过调用远程服务,同样是基于标准的http和https协议, flash remoting为什么选择了使用amf而放弃了soap与flash 播放器通信呢有如下原因:
soap将数据处理成xml格式,相对于二进制的afm太冗长了;
amf能更有效序列化数据;因为amf的初衷只是为了支持flash actionscript的数据类型,而soap却致力于提供更广泛的用途;
amf支持flash 播放器 6只需要浏览器增加4 kb左右(压缩后)的大小,而soap就大多了;
soap的一些头部文件请求在flash 播放器 6不支持。那flash 播放器 6为什么能访问基于soap的web服务呢?原来flashremoting网关将soap请求在服务器端与转换成afm格式,然后利用afm与flash 播放器通信。另外,amf包中包含on
result事件(比如说response事件)和onstatus事件(比如说error事件),这些事件对象在flash中可以直接使用。
amf从flash mx时代的amf0发展到现在的amf3。amf3用作flash playe 9的actionscript3.0的默认序列化格式,而amf0则用作旧版的actionscript 1.0和2.0的序列化格式。 在网络传输数据方面,amf3比amf0更有效率。amf3能将int和uint对象作为整数(integer)传输,并且能序列化actionscript 3.0才支持的数据类型, 比如bytearray,xml和iexternalizable。
