看流星社区

 找回密码
 注册账号
查看: 4258|回复: 2

Amf3协议分析与实现

[复制链接]

该用户从未签到

发表于 2013-7-30 16:03:26 | 显示全部楼层 |阅读模式
前沿:
     AMF(Action Message Format)是一种 二进制格式数据型态,AMF协议基于HTTP,将flash客户端数据编码后传回server,server端的remoting adaptor接收到数据后则会解码回正确的native对象,交给正确的程序处理,并以同样的数据组织方式响应客户端。AMF3相比较AMF0编码时经过高度压缩,因此非常适合用来传递大量的数据,根据flashorb网站的测试(主要针对web service与flash remoting),当数据量越大时,flash remoting的传输效能就越高。

1.Amf3协议分析

AMF3协议包括header和body,组成的数据将作为HTTP的body数据体部分进行发送。


AMF协议HEX进制表示:

00000000 :00 03  00 00 00 01  00 1d 42 61 73 65 53 65 72 76          BaseServ

00000010 :69 63  65 2e 64 6f   44 69 73 70 61 74 63 68 54  6f           ice.doDispatchTo

00000020 :42 61  74 63 68 00  02  2f 31 00 00 00 dc 0a 00 00           Batch     /1

前两个字节00 03 表示AMF版本,接下来两个字节表示AMF header个数,若header个数为0,则后面不跟header内容,蓝色标识的两个字节00 01是AMF body的个数,之后是AMF body部分。body会先写入AMF的target和response,是字符串形式,response表示请求的标识,target表示请求的类的方法。字符串写入的格式是先写入字符串长度(两个字节)后面跟着字符串内容。

本例中紫色标识的两个字节(00 1d)为target长度,之后跟着target的内容,粉红色的两个字节(00 02)表示response字符串长度。之后就是body的数据体部分。AMF3数据类型有如下几种方式:


[cpp] view plaincopyprint?class AMF3DataType  
{  
      public:  
         static const unsigned char   
                Undefined = 0,  
                Null = 0x01,  
                False = 0x02,  
                True = 0x03,  
                Integer = 0x04,  
                Double = 0x05,  
                String = 0x06,  
                XmlDoc = 0x07,  
                Date = 0x08,  
                Array = 0x09,  
                Object = 0x0A,  
                Xml = 0x0B,  
                ByteArray = 0x0C;  
};  

class AMF3DataType
{
      public:
         static const unsigned char
                Undefined = 0,
                Null = 0x01,
                False = 0x02,
                True = 0x03,
                Integer = 0x04,
                Double = 0x05,
                String = 0x06,
                XmlDoc = 0x07,
                Date = 0x08,
                Array = 0x09,
                Object = 0x0A,
                Xml = 0x0B,
                ByteArray = 0x0C;
};
数据体的数据组织方式可以参考amfphp实现 http://sourceforge.net/projects/amfphp/。你可以参考其数据组织方式用其他语言实现amf3协议,结合charles抓取数据包进行分析。

2.AMF3协议C++实现

写入缓冲区

   根据之前的AMF3协议的分析

(1).写入AMF版本        short version=3;        write(&version);  
(2).写入AMF头得个数        short headerCount=0;        write(&headerCount);  
(3).写入AMF数据体个数        short headerBody=0;        write(&headerBody);  
(4).写入AMF数据体内容        先写入target再写入response</SPAN>  

(1).写入AMF版本
      short version=3;
      write(&version);
(2).写入AMF头得个数
      short headerCount=0;
      write(&headerCount);
(3).写入AMF数据体个数
      short headerBody=0;
      write(&headerBody);
(4).写入AMF数据体内容
      先写入target再写入response
读取缓冲区


[cpp] view plaincopyprint?(1).读取AMF版本  
      short version=ReadShort();  
(2).读取AMF头得个数  
      short headerCount=ReadShort();  
      若amf3 header个数不为0,则需要解析header.//这一点相当的重要   
(3).读取AMF数据体个数  
      short headerBody=ReadShort();  
(4).读取AMF数据体内容  
      先读取target再读取response  
      若数据体不为0,解析数据体  

(1).读取AMF版本
      short version=ReadShort();
(2).读取AMF头得个数
      short headerCount=ReadShort();
      若amf3 header个数不为0,则需要解析header.//这一点相当的重要
(3).读取AMF数据体个数
      short headerBody=ReadShort();
(4).读取AMF数据体内容
      先读取target再读取response
      若数据体不为0,解析数据体

发送数据的封装:

(1) 由于为了兼容AMF0,AMF3发送数据时,

发送的最外层是AMF0::Array,里面一层是AMF3::ARRAY,amf3Array里面就都是AMF3 data

该用户从未签到

发表于 2014-2-7 11:57:22 | 显示全部楼层
学习下!!!!

该用户从未签到

发表于 2014-11-18 17:11:04 | 显示全部楼层
就是没易的?
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-27 04:00

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表