`
ct_xiao0310
  • 浏览: 24695 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

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了。

  • 分享到:
    评论

    相关推荐

      AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程

      远程过程调用(RPC)是一种计算通信协议,允许客户端向服务器发送请求,请求执行一个特定的过程,并获取结果,就好比是调用本地方法一样。用户不需要关心网络通信的细节,因为这些细节是抽象的。这种机制通常用于...

      Flex blazeds封装实体

      BlazDS提供了丰富的数据服务,包括远程方法调用(Remote Method Invocation, RMI)、消息代理(Message Brokering)以及数据推送等功能,使得Flex应用程序能够轻松地与Java服务器进行数据交互。 在Flex BlazDS中,...

      用BlazeDS实现Java和Flex通信

      - **远程调用**:BlazeDS支持远程调用POJOs、Spring服务或EJB方法,简化了跨平台的通信过程。 - **消息传递**:除了远程调用之外,BlazeDS还提供了一个消息系统,允许从客户端向服务器端发送消息,也可以从服务器端...

      BlazeDS 数据通信技术

      它允许开发者在客户端与服务器端之间轻松地发送远程调用和数据更新通知。为了更好地理解BlazeDS的工作原理,我们需要深入探讨其体系结构的关键组成部分。 ##### 1. Blazeds客户端体系结构 BlazeDS采用基于消息的...

      flex_4.6_accessingdata-zh_CN_中文文档

      RemoteObject组件提供了一种类似本地方法调用的远程数据访问方式,适用于AMF协议的通信场景,提供了更高级别的数据封装和安全控制。 #### 五、数据访问的最佳实践 为了确保数据访问的安全性和效率,开发者应遵循...

      J2ee整合flex3项目

      EJB可以通过BlazeDS暴露为远程服务,供Flex客户端调用。 3. **Spring框架**: Spring提供了更灵活的服务层管理,可以与BlazeDS无缝集成,创建服务代理并处理数据转换。 **四、Flex3客户端实现** 1. **UI设计**: ...

      基于Flex on java的客户关系系统

      远程对象(RemoteObject)是Flex与后台服务通信的一种机制,它封装了AMF(Action Message Format)协议,这是一种高效的二进制数据交换格式,用于在Flex客户端和Java服务之间传递数据。AMF能够显著提高数据传输效率...

      rtmp-specification-1.0-EN

      12. Remote Procedure Call(RPC 远程过程调用):允许客户端或服务器调用对端的一个子程序或者程序的请求。 13. Metadata(元数据):关于数据的一个描述,例如电影标题、持续时间、创建时间等等。 14. ...

      flex blazeds

      5. **Remoting and Messaging**: BlazDS的核心功能,允许客户端通过AMF直接调用服务器端的方法,以及订阅和发布实时消息。 6. **Flex Builder/Flash Builder**: Adobe提供的集成开发环境(IDE),专门用于Flex和...

      BlazeDs开发应用.pdf

      2. **RPC Services**:远程过程调用服务允许Flex或AIR客户端通过HTTP GET、POST、SOAP或Java Objects异步请求远程服务。HTTPService、WebService和RemoteObject是常见的客户端控件,用于调用这些服务,并将返回的...

      流媒体服务器资料.pdf

      Red5作为开源的Flash流媒体服务器,支持RTMP协议,具备转换音频和视频流、录制播放流、共享对象、现场直播发布和远程调用等功能,是开发者经济实惠的选择。 RTMP(Real Time Messaging Protocol)是Adobe为Flash...

      flex之BlazeDS案例

      这些配置文件会指定AMF通道,使得Flex可以找到Java的远程服务。 3. **Java后台服务**:可能包含了处理Flex请求的Java类,通常这些类使用Spring或其它依赖注入框架进行管理,以提供业务逻辑和数据访问。BlazeDS允许...

      FLEX和使用RemoteObject和后台通信

      在Flex开发中,与后端服务进行数据交互是常见的需求,`RemoteObject` 是Adobe Flex框架提供的一种组件,用于在Flex客户端与服务器之间实现远程调用(RPC, Remote Procedure Call)。`RemoteObject` 可以方便地将Flex...

      Cairngorm预览

      7. **RemoteProxy**:处理远程调用,如与AMF(Action Message Format)服务器的通信。 8. **Microkernel**:框架的核心,负责初始化和配置Cairngorm组件。 在【Contact】这个压缩包中,可能包含的是一个Cairngorm...

      flex结合java

      Remoting用于调用Java方法,实现远程方法调用(RPC),而Messaging则支持发布/订阅消息模型,用于实时通信。 4. **Spring框架集成**:Spring是一个流行的Java企业级应用框架,它可以与Flex完美结合。通过Spring-...

      Enterprise Development with Flex

      - **远程调用**:允许从客户端直接调用服务器端的方法。 #### 知识点六:整合Adobe LiveCycle ES SOA平台功能 - **SOA概念**:面向服务的架构(Service-Oriented Architecture)是一种设计系统的方法,它将应用程序...

      Flex的Cairngorm框架工程 Java后台

      6. **Proxy**:代理是数据访问层的一部分,用于封装对远程服务的调用,如Web服务或AMF数据。 7. **RemoteObject**:在Flex中,RemoteObject类是与服务器进行通信的组件,可以用来调用Java后台的服务。 8. **...

      Cairngorm 开发文档中文版

      7. 远程代理(RemoteProxy):用于与远程服务交互,如Web服务、AMF服务等。它封装了与服务的通信细节,提供了一种标准的方式来访问远程数据。 8. 服务定位器(ServiceLocator):作为一个全局的单例对象,服务定位...

      Flex、Spring、Hibernate 集成

      - **BlazeDS** 支持**Flex** 对Java对象的远程调用,并可以部署在多种Web应用服务器上,例如Tomcat、WebSphere、JBoss等。 ### 5. 示例程序分析 假设我们有一个示例程序,它是一个在线宠物商店的应用场景,可以...

      StepByStep学FLEX教程.pdf

      - **远程对象(RemoteObject)**:讲解了如何使用RemoteObject组件进行远程调用,并展示了具体的代码示例。 - **AMF**:AMF(Adobe Message Format)是一种用于传输数据的二进制格式,本节简要介绍了AMF的基本概念。 ...

    Global site tag (gtag.js) - Google Analytics