前沿:
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.doDispatchTo00000020 :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數據類型有如下幾種方式:
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
讀取緩衝區
(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
待續........