Amf3協議分析與實現

前沿:
     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數據類型有如下幾種方式:

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

待續........


發佈了77 篇原創文章 · 獲贊 21 · 訪問量 105萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章