- 浏览: 719115 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (389)
- flex (150)
- java (55)
- flex_sharedObject (4)
- iphone/android (7)
- red5 (4)
- blazeds (19)
- ajax (3)
- flex&java (9)
- 聊天室 (2)
- flex的问题 (1)
- game (8)
- flex_xml (1)
- flex组件学习 (2)
- JGroups (1)
- 中转站 (2)
- ruby (7)
- flex_js (5)
- C/C++ (14)
- perl (2)
- db (13)
- air (10)
- hibernate (8)
- flash_flex_as_3d (2)
- struts (4)
- dwr (8)
- freemarker (2)
- AS (22)
- 工具 (6)
- js_jquery_ext_yui (4)
- .net (1)
- C# (1)
- 前端 (1)
最新评论
-
136900923:
您好,您的代码我不是很懂,我想跟您交流一下,我的qq邮箱:13 ...
hibernate做无限极菜单树如此简单 -
fykyx521:
两个同一个功能
flex_flush_Socket 安全沙箱解决 -
ustb:
你上下两个代码类之间没关系
flex_flush_Socket 安全沙箱解决 -
u010656335:
...
flex发送QQ表情 -
u010656335:
flex发送QQ表情
原文 http://www.pixelbender.cn/?p=272
AMF是Action Message Format协议的简称,AMF协议是Adobe公司自己的协议,主要用于数据交互和远程过程调用,在功能上相当于WebService,但是AMF与 WebService中的XML不同的是AMF是二进制数据,而XML是文本数据,AMF的传输效率比XML高。AMF使用HTTP方式传输,目前主要是 用于ActionScript中,即实现Flex和Server之间的通信。
我是做.Net开发的,按理说和AMF没有什么关系,主要是最近在耍一款网页游戏:纵横天下,该游戏就是采用Flex做的客户端,为了能够做出该游 戏的挂机程序,所以才开始学习研究AMF的。闲话休说,言归正传,下面继续说AMF协议,在例子中我使用的AMF数据就是从纵横天下中抓取的AMF数据。
AMF目前有两种版本,AMF0和AMF3,他们在数据类型的定义上有细微不同。关于AMF的官方文档参见这里 。
Number | 0×00 | |
Boolean | 0×01 | |
String | 0×02 | |
Object | 0×03 | |
MovieClip | 0×04 | Not available in Remoting |
Null | 0×05 | |
Undefined | 0×06 | |
Reference | 0×07 | |
MixedArray | 0×08 | |
EndOfObject | 0×09 | See Object |
Array | 0x0a | |
Date | 0x0b | |
LongString | 0x0c | |
Unsupported | 0x0d | |
Recordset | 0x0e | Remoting, server-to-client only |
XML | 0x0f | |
TypedObject (Class instance) | 0×10 | |
AMF3 data | 0×11 | Sent by Flash player 9+ |
{
Number = 0 ,
Boolean = 1 ,
String = 2 ,
UntypedObject = 3 ,
MovieClip = 4 ,
Null = 5 ,
Undefined = 6 ,
ReferencedObject = 7 ,
MixedArray = 8 ,
End = 9 ,
Array = 10 , // 0x0A
Date = 11 , // 0x0B
LongString = 12 , // 0x0C
TypeAsObject = 13 , // 0x0D
Recordset = 14 , // 0x0E
Xml = 15 , // 0x0F
TypedObject = 16 , // 0x10
AMF3data = 17 // 0x11
}
double num = BitConverter.ToDouble(d, 0 );
string str = System.Text.Encoding.UTF8.GetString(buffer);
3.Object在.net中对应的就是Hashtable,内容由UTF8字符串作为Key,其他AMF类型作为Value,该对象由3个字节:00 00 09来表示结束。C#中读取该对象使用如下方法:
{
Hashtable hash = new Hashtable();
string key = ReadShortString();
for ( byte type = ReadByte(); type != 9 ; type = ReadByte())
{
hash.Add(key, ReadData(type));
key = ReadShortString();
}
return hash;
}
{
int size = ReadInt32();
Hashtable hash = new Hashtable(size);
string key = ReadShortString();
for ( byte type = ReadByte(); type != 9 ; type = ReadByte())
{
object value = ReadData(type);
hash.Add(key, value);
key = ReadShortString();
}
return hash;
}
10.Array对应的就是.net中的ArrayList对象,该对象首先使用32位整数定义了ArralyList的长度,然后是密集的跟着ArrayList中的对象,读取该对象使用如下函数:
{
int size = ReadInt32();
ArrayList arr = new ArrayList(size);
for ( int i = 0 ; i < size; ++ i)
{
arr.Add(ReadData(ReadByte()));
}
return arr;
}
11.Date对应.net中的DateTime数据类型,Date在类型标识符0x0B后使用double来表示从1970/1/1到表示的时间所经过的毫秒数,然后再跟一个ushort的16位无符号整数表示时区。读取Date类型的C#代码为:
{
double ms = ReadDouble();
DateTime BaseDate = new DateTime( 1970 , 1 , 1 );
DateTime date = BaseDate.AddMilliseconds(ms);
ReadUInt16(); // get's the timezone
return date;
}
12.LongString对应的也是string类型,不过和2对应的String不同的是这里使用32位整数来表示字符串的UTF8长度,而String使用的是16位。
15.XML是使用类型标识符0x0F后直接跟LongString类型的字符串表示。
这里大部分代码我都是摘自AMF.net 一个开源的.net AMF序列化和反序列化的库,大家若有兴趣可以到http://sourceforge.net/project/showfiles.php?group_id=159742
去下载。另外http://osflash.org/documentation/amf/astypes
这个英文网站也对AMF数据类型作了比较详细的介绍。
------------------------------------------
前一篇文章 中已经学习了AMF数据类型,那么接下来就要将一个完整的AMF文件的封装格式了。
AMF文件总体来说分为4部分:前言(Preamble )、AMF头、AMF主体和主体的响应。
前言的前2字节用于说明AMF的版本,目前AMF有2个版本AMF0和AMF3.如使用AMF0则是:00 00
第3和第4字节用16位整数表示AMF头的数量。
每一个AMF头是由以下四部分组成:
UTF string 表示Header的名字
Boolean 表示该Header是否是必须的
Int32表示Header的长度,但是好像很多情况下该值为FF FF FF FF,似乎这个字段没有意义。
Variable变量是某种AMF数据类型。
在Header表示完后,接下来是一个16位的整数用来表示AMF主体的数量,在这个数量之后才是AMF主体。
AMF主体主要由以下四部分组成:
UTF String - Response表示请求的类和方法或响应的结果。
UTF String - Target是一个标识,其作用就是为了实现请求和响应的对应,通过Target找到该响应对应的请求。一般使用自增整数。
Int32- 表示主体的长度,该字段一般没有什么用
Variable变量表示主体的数据。
主体响应是客户端向服务器发送一个AMF请求以后服务器做出的和请求的主体格式相同的AMF响应,但是主体响应中的内容有所不同:
Response: 被设置为字符串‘null’.
Target: 是请求的Target值再加上“/onStatus”, “onResult”, 或者 “/onDebugEvents”组成. “/onStatus” 是为运行时错误而准备的我们一般不关心这个. “/onResult” 表示该请求被正确调用. “/onDebugEvents” 是在调试时使用的,这里也不用关心. 如果请求的Target是‘/1’, 那么被成功调用以后的主体响应应该是: ‘/1/onResult’ 。
Data:就是响应后返回的AMF对象。
说了这么多估计还是感觉比较抽象,下面给出个实例:
AMF 16进制内容00000000h: 00 00
00 00
00 01
00 1B
7A 68 2E 66 6C 65 65 74 ; ........zh.fleet
00000010h: 53 65 72 76 69 63 65 2E 67 65 74 46 6C 65 65 74 ; Service.getFleet
00000020h: 52 6F 77
00 03
2F 37 39
00 00 00 13
0A 00 00 00 ; Row../79........
00000030h: 03
02 00 01 35
02 00 03 38 34 35
02 00 01 35
; ....5...845...5
以上是客户端向服务器发送的一个AMF请求。我们可以按照前面说的封装方式将该amf解析如下:
00 00(AMF0版本)00 00(Header个数为0)00 01(AMF主体有1个)
00 1B(请求的方法的字符串长度为27个字节)
7A ……77(这27个直接就是调用的类和方法:“zh.fleetService.getFleetRow”)
00 03(请求的Target字符串长3字节) 2F 37 39(Target的内容:“/79”)
00 00 00 13(主体的长度为19)
0A(传入的变量是一个Array)00 00 00 03(该Array的长度为3)02 00 01 35(Array的第一个值是字符串“5”)02 00 03 38 34 35(Array的第二个值是字符串“845”)02 00 01 35(Array的第三个值是字符串“5”)
现在整个AMF对象都解析出来了,我们可以认为是客户端调用了服务器的方法:zh.fleetService.getFleetRow("5", "845", "5")
服务器返回的AMF文件的内容的解析方式相同,这里我就不再重复了。
现在我们已经对AMF文件有了一个清晰的认识了。那么接下来就是要抓包,看某些在Flex上的操作对应的发送了什么AMF文件,服务器返回了什么AMF文件。将这些AMF文件解析出来然后就可以看到调用了API了。
发表评论
-
转深入理解Flash的沙箱 – Security Domains
2014-01-22 09:35 842一篇很经典的进阶文章,国外牛人的分享,清晰明了,图文并茂,适 ... -
flex 很有用的东东!
2010-06-17 23:50 1269网上找了好久,原来API中就有! -
flex出现的一些问题
2010-04-08 12:19 16701.kingnarestyle.swf和flexlib 的Su ... -
flex 样式工作原理【转】
2010-04-08 12:09 1326http://hi.baidu.com/ls_mcx/blog ... -
在FlexBuilder3中使用Actionscript3进行元编程
2010-03-11 19:15 1044http://flash.9ria.com/thread-46 ... -
Error: No class registered for interface mx
2010-02-01 09:36 1248http://www.gold98.net/blog/arti ... -
Flash 视频(FLV)编码,转换,录制,播放方案一网打尽
2010-01-16 18:34 2023http://www.htmlit.com.cn/post/8 ... -
FLEX中使用FLVPlayback控件.
2010-01-16 18:29 1402http://www.cnblogs.com/xxcainia ... -
flex 继承Application及xml命名空间
2009-12-30 18:43 1522<?xml version="1.0" ... -
flex Repeater effert加效果
2009-12-15 17:25 1528package cn.ishion.component { ... -
学习自定义组件---ConstomButton
2009-12-14 15:06 1838效果只是让Button动了下, 上传了flash源文件 p ... -
flex编译生成的As代码
2009-12-09 18:30 1315new flexProject ->起名叫 test ... -
flex自定义preloader
2009-12-09 17:43 1918package cn.ishion.component { ... -
flex自定义程序 preloader 加载多个资源
2009-12-09 02:05 2291package cn.ishion.component { ... -
Flex Builder编译错误An internal build error has occurred的解决方法
2009-12-05 16:44 3216原文:http://as3blog.com/resources ... -
flex uicomponent.addChild(Button) Button不显示
2009-12-04 19:23 2147设置下Button的宽度和高度就行了 var ui:U ... -
as3 xls导出excel乱码问题解决办法
2009-12-04 11:37 3401http://blog.csdn.net/Baijinwen/ ... -
FlashDevelop配置Flex4(gumbo)环境
2009-12-04 10:27 3057http://www.flexrain.cn/fl ... -
flex gooogle code as3xls导出数据到excel
2009-12-03 19:16 2365var ex:ExcelFile=new ExcelFile ... -
Flex坐标系统及转换
2009-12-02 22:10 3105http://flash.9ria.com/thread-40 ...
相关推荐
AMF-1.4.33.zip文件可能是AMF的一个特定版本的实现,包含了所有必要的组件和资源,帮助开发者更好地利用这一技术。如果你正在使用Flex、Flash或其他支持AMF的平台,这个更新可能会对你的项目带来性能提升和功能增强...
AMF.NET是一个小型而高效的开源库,专门用于处理Action Message Format (AMF)数据流。AMF是一种二进制的数据交换格式,常用于Flash、Flex和Adobe AIR等技术中的远程方法调用(RPC)和数据传输。FluorineFx是另一个...
支持AS3的ByteArray序列化对象的AMF格式编码、解码( readObject、writeObject )。 支持AS3的ByteArray的compress、uncompress压缩算法:DEFLATE、LZIB、LZMA。 支持直接修改AS3的ByteArray字节流内编码的对象。 ...
AMF,全称为Action Message Format,是一种数据序列化协议,主要在Adobe的Flex、Flash Player以及服务器端技术如Adobe LiveCycle Data Services等中使用。它允许应用程序之间高效地传输复杂的数据结构,包括对象、...
AMF3(Action Message Format version 3)协议是Adobe公司为Flash Player和Flex应用程序之间通信设计的一种二进制数据交换格式。它旨在提高数据传输效率,同时保持足够的灵活性以适应不同类型的复杂数据结构。AMF3...
AMF3(Action Message Format version 3)是Adobe公司开发的一种二进制数据序列化格式,主要用于Flash Player和Flex应用程序与服务器之间的数据交换。在C++编程环境中,AMF3库可以帮助开发者高效地处理这种数据格式...
在文件列表中,我们看到一个名为“amf3_spec_05_05_08.pdf”的文档,这很可能是AMF3规范的详细说明,包含了AMF3的编码规则、解码过程、数据类型的映射以及如何在Flash Player中使用AMF3进行通信的详细信息。...
4. **优化性能**:AMF3的引入是为了提高数据传输效率,因此一个好的AMF库应该能够利用AMF3的特性,如压缩和优化数据表示,来提高解析和序列化的速度。 5. **自定义类型支持**:允许用户注册自定义的Python类,并...
AMF0,全称为Action Message Format 0,是Adobe Flex框架中的一个数据序列化协议,用于在...通过深入阅读《amf0_spec_121207.pdf》文档,开发者可以更好地理解AMF0的工作原理,并利用这一特性优化他们的应用性能。
AMF是一种高效的数据交换格式,常用于Adobe Flex和Adobe Flash Player与服务器之间的通信,它能快速序列化和反序列化数据,提高Web服务的性能。 AMF的核心特点包括: 1. **高效性**:相比于XML或其他文本格式,AMF...
AMF有两种主要的版本:AMF0和AMF3,其中AMF3提供了更好的压缩和性能。 AMF解码则是将接收到的二进制数据还原成原始的对象或数据结构,这一过程对于正确解析服务器返回的信息至关重要。易语言类库提供的AMF编码解码...
AMF(Action Message Format)是一种数据交换格式,主要用于Flash与服务器之间的通信,尤其在Adobe Flex应用中广泛应用。AMF数据分析器是一款专为处理和解析AMF数据而设计的专业工具,旨在提升开发人员对AMF数据的...
- AMF分为两种类型:AMF0和AMF3,其中AMF3提供了更好的压缩和性能。 2. **Flex与AMF通信** - Flex应用通常通过HTTP/HTTPS与服务器通信,使用AMF协议封装数据,通过Flash Player发送到服务器。这些请求可能包括...
标题中的"AMF.rar_FluorineFx_FluorineFx amf_amf__flex_flex amf"表明这是一个关于AMF(Action Message Format)技术的压缩包,其中包含了FluorineFx的相关资料。FluorineFx是.NET平台上开源的Adobe Flash Remoting...
Lua-Amf 是一个专为 Lua 语言设计的AMF(Action Message Format)解析库,它使得在 Lua 环境中处理AMF3格式的数据变得简单高效。AMF是一种二进制序列化格式,常用于Flash与服务器之间的数据交换,如Adobe的Flex和...
AMF(Action Message Format,动作信息格式)是一种压缩的二进制格式,用于序列化 ActionScript 对象图。序列化后的 AMF 编码对象图可以用来持久化,并在不同的会话中获得应用的公共状态,或者允许在两个端点(如...
AMF(Action Message Format)是Adobe公司开发的一种二进制数据序列化格式,常用于Flash与服务器之间的数据交换。AMF格式提供了高效的数据传输,它能够将复杂的数据结构如对象、数组、日期等编码为二进制流,从而...
AMF3(Action Message Format version 3)是Adobe公司开发的一种二进制数据序列化格式,主要用于Flash Player与服务器之间的数据交换。它提高了数据传输效率,支持多种数据类型,包括基本类型、对象、数组、日期等。...
但是,如果你选择自己实现,这将是一个很好的学习机会,可以深入理解AMF协议以及易语言的编程机制。 最后,文件名"amf解析构造易语言源码.e"表明你可能已经得到了一个包含易语言源代码的项目文件。打开这个文件,你...
AMF3,全称为Action Message Format 3,是Adobe公司为Flash Player和Flex应用程序之间进行数据交换设计的一种高效二进制序列化格式。这个“AMF3 C++ 源码(修改版)”提供了对AMF3协议的C++实现,支持序列化和对象化...