Amf3協議分析與實現

2021-06-22 11:51:24 字數 2194 閱讀 4167

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 6800  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 plain

copy

class

amf3datatype ; 

資料體的資料組織方式可以參考amfphp實現 

。你可以參考其資料組織方式用其他語言實現amf3協議,結合charles抓取資料報進行分析。

2.amf3協議c++實現

寫入緩衝區

根據之前的amf3協議的分析

[cpp]view plain

copy

"font-size:18px;"

>(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 plain

copy

(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

待續........

心得 對AMF3的誤解

心得 對amf3的誤解 2008 12 16 11 55 從我知道有amf格式開始,就一直有個印象,amf是壓縮過的位元組流。而且很多地方對於amf格式的 中文化文件都是這麼說。引用 action message format amf is a compact binary format that ...

心得 對AMF3的誤解

心得 對amf3的誤解 從我知道有amf格式開始,就一直有個印象,amf是壓縮過的位元組流。而且很多地方對於amf格式的中文化文件都是這麼說。引用 amf action message format 動作資訊格式 是用來序列化as actionscript 動作指令碼 例項物件 object gra...

如何獲取AMF3物件類名

對不熟悉amf3的人來說,這名詞有點玄乎,amf3不過兩個函式而已 編碼 把物件序列化成amf3 1 batearray.writeobject obj object void 解碼 反序列化,獲取物件 2 batearray.readobject object 如果需要序列化的物件就是乙個雜湊ma...