AMF学习2远程调用的封装

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

前一篇文章中已经学习了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了。

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/archive/2008/04/11/1147658.html

,如需转载请自行联系原作者

相关文章
|
存储 Cloud Native Linux
C++封装了socket通信类
C++封装了socket通信类
|
1月前
|
自然语言处理 Dubbo Java
RPC基础
RPC基础
35 0
|
4月前
|
网络协议 Dubbo Java
什么是RPC?RPC和HTTP对比?RPC有什么缺点?市面上常用的RPC框架?
选择合适的RPC框架和通信协议,对于构建高效、稳定的分布式系统至关重要。开发者需要根据自己的业务需求和系统架构,综合考虑各种因素,做出适宜的技术选型。
374 1
|
6月前
|
XML JSON API
⚡REST 和 SOAP 协议有什么区别?
这篇文章对比了 REST 和 SOAP 两种常见的 Web API 规范。REST 是一种 API 架构风格,遵循客户端-服务器、无状态和缓存等原则,使用 HTTP 协议和 JSON 格式,适合轻量级、高兼容性的场景。SOAP 是一种基于 XML 的网络服务访问协议,提供消息级安全性和 ACID 合规性,适用于企业级应用。REST 的优点包括前后端分离、浏览器兼容和带宽效率,而 SOAP 适用于需要高级安全特性的应用。除了 REST 和 SOAP,还有 gRPC 和 GraphQL 等其他选择。
|
6月前
|
JSON 负载均衡 网络协议
RPC远程调用协议
RPC远程调用协议
89 0
|
6月前
|
存储 JSON 数据格式
NVMf RPC接口文件 nvmf_rpc.c
NVMf RPC接口文件 nvmf_rpc.c
|
存储 搜索推荐 API
如何设计 RPC 接口
如何设计 RPC 接口
242 0
|
消息中间件 XML JSON
一文就读懂RPC远程调用核心原理
rpc的全称是Remote Procedure Call,即远程过程调用,是分布式系统的常用通信方法。 Remote,简单来说的话就是两个不同的服务之间,两个服务肯定是两个不同的进程。因此,我们就从跨进程进行访问的角度去理解就行了。 Procedure,意思是一串可执行的代码,我们写Java的方法,就是一段课程行的代码。 Call,即调用,调用的就是跨了进程的方法。
372 0
一文就读懂RPC远程调用核心原理
|
网络协议 Dubbo Java
【远程调用框架概述 一】基于HTTP和RPC的远程调用方式
【远程调用框架概述 一】基于HTTP和RPC的远程调用方式
382 0