博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AMF协议的数据封装和文件解析
阅读量:4106 次
发布时间:2019-05-25

本文共 1983 字,大约阅读时间需要 6 分钟。

 AMF协议的数据封装和文件解析(1)

通过前面的学习,我们今天来讲解一下有关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.fleet00000010h: 53 65 72 76 69 63 65 2E 67 65 74 46 6C 65 65 74 ; Service.getFleet00000020h: 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了。

原文:

转载地址:http://dejsi.baihongyu.com/

你可能感兴趣的文章
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
分布式之redis复习精讲
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>
使用JSTL
查看>>
Java 8新特性:Stream API
查看>>
管理用户状态——Cookie与Session
查看>>
最受欢迎的前端框架Bootstrap 入门
查看>>
JavaScript编程简介:DOM、AJAX与Chrome调试器
查看>>
通过Maven管理项目依赖
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Spring的IoC(依赖注入)原理
查看>>
Java编程基础:static的用法
查看>>
Java编程基础:抽象类和接口
查看>>