AMF和AMF3规范

时间:2011-12-05 17:39:40

标签: flex blazeds specifications amf

我目前正在研究小型AMF3适配器,因此尝试实施AMF3协议。不幸的是,可用的规范似乎与现实大不相同(AMF与BlazeDS通信的Captre并查看BlazeDSs源代码)。

AMF0规格:http://opensource.adobe.com/wiki/download/attachments/1114283/amf0_spec_121207.pdf AMF3规格:http://opensource.adobe.com/wiki/download/attachments/1114283/amf3_spec_05_05_08.pdf

不幸的是,两者都没有指定实际的消息格式(Header,Body,...)。所以我再搜索了一下,来到维基百科的一篇文章:http://en.wikipedia.org/wiki/Action_Message_Format

本文特别是示例部分似乎描述了一种完全不同的格式。

当查看通信并单步执行BlazeDS代码时,我可以看到消息声称是AMF3,但使用AMF0中定义的类型代码(0x0a是严格的数组而不是对象,如AMF3)。

有人可以向我解释一下这个烂摊子吗?目前我可以简单地使用wireshark和BlazeDS代码以某种方式为我反向设计协议描述,但我不知道为什么不能使用单个有效规范。

2 个答案:

答案 0 :(得分:3)

AMF的核心只是一个ActionScript对象序列化格式。

Flash的NetConnection API扩展了这种格式,通过AMF 0规范第4节中描述的简单标头/消息体请求/响应结构来添加基本的RPC功能。我认为这个RPC的添加可能让您感到困惑,因为它是定义如何从服务器发送和接收AMF数据的各个有效负载的基础结构。例如,通过ByteArray.writeObject,这个包装器不会用于基本的ActionScript对象序列化。它是基于NetConnection的服务器通信的附加逻辑。

请参阅:http://download.macromedia.com/pub/labs/amf/amf0_spec_121207.pdf

实际为标头值或邮件正文值发送的ActionScript数据在AMF中编码。出于兼容性考虑,所有数据值均以AMF 0开始。这可能是在查看基本AMF序列化与基于NetConnection的通信时首先使人们绊倒的另一点。由于添加到AMF 0的特殊扩展,引入了新的0x11“AMF 3”模式标记,将序列化模式切换为AMF 3.不支持AMF 3的旧版客户端无法理解这个新标记并将停止处理数据。这在AMF 0规范的第3节中提到。

AMF 3规范在这里: http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf

答案 1 :(得分:1)

有两种常见类型的AMF消息传递:AMF0样式的RPC调用和RTMP。 AMF0 RPC调用由版本,标题列表和消息列表组成,大致等同于调用方法。这在AMF0规范的末尾有记录,可用于进行AMF0或AMF3远程调用。如果您正在使用Flex RemoteObject,则Flex会在消息传递中使用一些其他包装器对象。第二种类型是您发现的维基百科文章引用的内容,是RTMP使用的消息格式,它是AMF和它自己的自定义格式的组合。据我所知,这种格式没有规格。

作为构建了一个可以解析AMF并进行RPC调用(RocketAMF)的库的人,我建议您使用现有的库之一而不是编写自己的库,如果您只需要远程支持。下面列出了一些按语言分析AMF的库,还有一些简单的搜索。您可能还想查看Charles,它能够反序列化通过它代理的AMF请求,使逆向工程更容易。