1、AMF简介

(1)简介

AMF(Action Message Format),即操作消息格式,基于http方式传输,是一种二进制的数据格式。主要用于数据交互和远程过程调用。它的设计是为了把actionscript里面的数据(包括Object, Array, Boolean, Number等)序列化成二进制数据,然后把这段数据随意发送给其他接收方程序,比如发给远程的服务器,在远程服务器那边,可以把这段数据给还原出来,以此达到一个数据传输的作用。

(2)AMF0和AMF3的历史

AMF引进于2001年的FlashPlayer6,并且在引入AS2.0的FlashPlayer7和FlashPlayer8中没有改变的保留了。这个版本的AMF参考于AMF0(查阅[AMF0])。在FlashPla yer9中,AS3.0同新的AS虚拟机(AVM+)一起被引进—新的数据类型和语言特性的改进致使AMF升级成为可能,给了一个发布新的AMF版本的机会,新版本的AMF在序列化数据的时候做了一些优化,使得编码格式去除了一些冗余信息。升级后的AMF版本便是AMF3。

第一个版本的AMF,即AMF0,支持在避免了在对象图中发送冗余的实例的通过引用发送复杂的对象。他也允许端点存储对象关系,并且支持避免一些问题,在序列化时无穷的递归的情况下的循环引用。新版本的AMF,即AMF3,与AS3.0(ActionScript 动作脚本)版本保持一致,在通过引用发送除对象实例外的对象特性和字符串做了改进。AMF3也支持在AS3.0中的一些新的数据类型。

那么AMF3出来之后AMF0是不是可以退休了?答案也是否定的。大家现在接触到的AMF3消息流基本上都是在AMF3外面包了一层AMF0, 也就是说我们看到的所有AMF数据流都是AMF0的,当数据流中的某个数据的type=0×11时,才表示这个数据应该属于AMF3的数据,在这个时候就会切换到AMF3的模式来处理这个数据。处理完之后当然还是继续回到AMF0的模式处理数据。

2、为什么要用AMF

通常情况下我们使用JSON或者XML来做数据的传输,他们的好处是文本数据易读、容易修改,坏处在于文本数据体积较大,而且数据的组织有其局限性。同样是轻量级数据交换协议,同样是通过调用远程服务,同样是基于标准的HTTP和HTTPS协议, Flash Remoting为什么选择了使用AMF而放弃了SOAP与Flash 播放器通信呢? 有如下原因:

  • SOAP将数据处理成XML格式,相对于二进制的AFM太冗长了。
  • AMF能更有效序列化数据。因为AMF的初衷只是为了支持Flash ActionScript的数据类型,而SOAP却致力于提供更广泛的用途。
  • AMF在对Flash Player 6 的浏览器支持上AMF只需要4KB左右(压缩后)的大小,而SOAP就大多了;SOAP的一些头部文件请求在Flash Player 6 不支持。
  • AMF最大的特色在于可直接将Flash内置对象,例如Object, Array, Date,XML,传回服务器端,并且在服务器端自动进行解析成适当的对象。

3、AMF格式

AMF分成两种:AMF0,基本的数据转换规则;AMF3,是AMF0的扩展。

(1)AMF0

// AMF0数据类型;
typedef enum
{AMF_NUMBER = 0,         // 数字(double);AMF_BOOLEAN,            // 布尔;AMF_STRING,             // 字符串;AMF_OBJECT,             // 对象;AMF_MOVIECLIP,          // 保留,未使用;AMF_NULL,               // null;AMF_UNDEFINED,          // 未定义;AMF_REFERENCE,          // 引用;AMF_ECMA_ARRAY,         // 数组;AMF_OBJECT_END,         // 对象结束;AMF_STRICT_ARRAY,       // 严格的数组;AMF_DATE,               // 日期;AMF_LONG_STRING,        // 长字符串;AMF_UNSUPPORTED,        // 未支持;AMF_RECORDSET,          // 保留,未使用;AMF_XML_DOC,            // xml文档;AMF_TYPED_OBJECT,       // 有类型的对象;AMF_AVMPLUS,            // 需要扩展到AMF3;AMF_INVALID = 0xff      // 无效的;
}AMFDataType;

(2)AMF3

// AMF3数据类型;
typedef enum
{AMF3_UNDEFINED = 0,     // 未定义;AMF3_NULL,              // null;AMF3_FALSE,             // false;AMF3_TRUE,              // true;AMF3_INTEGER,           // 数字int;AMF3_DOUBLE,            // double;AMF3_STRING,            // 字符串;AMF3_XML_DOC,           // xml文档;AMF3_DATE,              // 日期;AMF3_ARRAY,             // 数组;AMF3_OBJECT,            // 对象;AMF3_XML,               // xml;AMF3_BYTE_ARRAY         // 字节数组;
} AMF3DataType;

(3)AMF自定义的字符串

// AMF自定义的字符串;
typedef struct AVal
{char *av_val;int av_len;
} AVal;

(4)AMF对象

// AMF对象, 就是由一系列的属性构成的;
typedef struct AMFObject
{int o_num;                          // 属性数目;struct AMFObjectProperty *o_props;  // 属性数组;
} AMFObject;

AMFObject表示AMF对象,o_num 代表 o_props的个数, 一个对象内部可以包含N个对象属性;

(5)AMF对象的属性

// AMF对象的属性;
typedef struct AMFObjectProperty
{AVal p_name;            // 属性名称;AMFDataType p_type;     // 属性类型;union{double p_number;AVal p_aval;AMFObject p_object;} p_vu;                 // 属性数值;int16_t p_UTCoffset;    // UTC偏移;
} AMFObjectProperty;

AMFObjectProperty表示AMF对象属性,即key-value键值对。p_name表示key;p_type表示value的类型;p_vu表示value的数值。p_vu设置为联合体的目的:

  • 当p_type为number时, m_vu取值double类型 p_number;
  • 当p_type为string时,    m_vu取值AVal类型 p_aval;
  • 当p_type为object时,   m_vu取值AMFObject类型 p_object。

(6)AMF的初始化和字符串比较

// AVal的快速初始化;
#define AVC(str)        {str, sizeof(str)-1}
// 比较AVal字符串;
#define AVMATCH(a1,a2)  ((a1)->av_len == (a2)->av_len && !memcmp((a1)->av_val,(a2)->av_val,(a1)->av_len))

4、AMF的内容处理流程

AMF协议是基于Http协议的,它的内容处理过程大致是这样:

  • 从客户端获取Http请求(Request)流;
  • 对流进行解串行化(Deserialize),得到服务器端程序能够识别的数据,并建立一个响应(Response)消息;
  • Debug开始;
  • 对流进行各种处理(记录、许可、服务)得到返回值;
  • 对响应流进行串行化;
  • 发送Http响应给客户端;

AMF(Action Message Format)简介相关推荐

  1. AMF(Action Message Format)其它语言对象转ActionScript对象[转]

    Flex是前端的界面技术,而后端和数据库交互或大型运算依然需要依托Java..Net.PHP.Ruby等语言.早在Flash 8的时候Adobe就提出AMF(Action Message Format ...

  2. IMF(Internet Message Format)简介

    文章目录 一.IMF是什么 二.在Wireshark中 一.IMF是什么 IMF(Internet Message Format)因特网消息格式.因特网消息格式是指文本消息在因特网上传输的格式. 其中 ...

  3. 邮箱格式的正则表达式与RFC 5322 Internet Message Format

    为什么80%的码农都做不了架构师?>>>    百度下邮箱格式的正则表示,能够搜索到各式各样,五花八门的表示.如果没有仔细甄别,错误使用其中的一些代码,则很可能造成在遇到一些特殊的邮 ...

  4. tc35i pdu message format

    术语: SM SIM message storage ME Mobile Equipment message storage MT Sum of ME and SM storages TE(PC.单片 ...

  5. java message_Java Message System简介

    java message Java消息系统 在本文中,我将讨论面向消息的中间件 (MOM)以及JMS如何在Enterprise Java中实现它. 此外,我还将讨论适合JMS使用的典型用例以及用于讨论 ...

  6. (转)Python 字符串格式化 str.format 简介

    原文:https://www.cnblogs.com/wilber2013/p/4641616.html http://blog.konghy.cn/2016/11/25/python-str-for ...

  7. Java Message System简介

    Java消息系统 在本文中,我将讨论面向消息的中间件 (MOM)以及JMS如何在Enterprise Java中实现它. 另外,我将讨论适合JMS使用的典型用例以及用于讨论消息传递解决方案的不同术语, ...

  8. 【kafka】kafka DefaultRecordBatch. The older message format classes only support conversion from class

    文章目录 1.概述 2. 2.3版本 本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 1.概述 今天想写一个事务的kafka生产者和消费者,然后我在本地 ...

  9. 打开新页打开企业邮箱FOXMAIL常见错误提示“Message format error”

    这通常是因为邮箱数据文件(.box文件)或者邮箱索引文件(.ind文件)数据不一致或者遭到破坏引起的,一般可以通过修复邮箱操作加以修复.为了保证数据安全,建议在修复有之前,先备份邮箱对应的box文件. ...

最新文章

  1. windows下vs2013使用C++访问redis
  2. 小程序开发系类之基础部分-开发工具
  3. iptables 开放远程_远程FX正式上市 指导价11.99万-12.99万元_搜狐汽车
  4. ExtJs非Iframe框架加载页面实现
  5. 那些你不知道的 LVS 秘密!
  6. 转专业计算机c语言,转专业申请美国计算机专业研究生必须要做的准备
  7. mysql自带的全文索引_MySQL创建全文索引分享
  8. 互联网人必读 | 大数据思维的十大核心原理
  9. DOCX%20是什么格式
  10. 【程序员面试金典】有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。
  11. WordPress教程:如何给网站添加导航?
  12. css之calc,初探CSS3中的calc()功能
  13. 续 Codeforces 596 C Wilbur and Points
  14. 2022年终总结(学习篇)
  15. h5 禁止微信内置浏览器调整字体大小方法
  16. 360度全景虚拟漫游导览在地产景区的应用优势
  17. 使用静态分析,帮助实现GDPR的“设计安全”和“设计隐私”
  18. 同步传输与异步传输【转载】
  19. 中兴智能视觉大数据报道:进小区1秒人脸识别,自动打开道闸放行
  20. Overleaf latex绘制三线表

热门文章

  1. linux内核版本切换
  2. C语言 goto语句
  3. Android 两个view并列显示
  4. SpringBoot + Spock
  5. windows server系统查看tomcat版本
  6. Houdini 学习笔记(二)
  7. 60个经典的电脑使用技巧
  8. php cms 源码,PHPCMS v9.6.1 UTF8
  9. Linux 查询服务器序列号命令
  10. socket利用bind函数绑定本地端口号和IP地址,一直提示错误,返回10049,