BOCOO Online (Beijing) Ltd
Ruby 与 Flex 交互采用 AMF 协议 通信详细 详细分析 通信详细分析
作者: 作者:邹英俊
2010 年 10 月 31 日
第1版
Confidential Information
Property of BOCOO Online (Beijing) Ltd
目
第一章 第二章 第三章 第四章
录
AMF 协议概述 ................................................................ 3 Flex 与 ROR 交互方法 ...................................................... 4 交互性能分析 ............................................................... 9 总结 ......................................................................... 10
Confidential Information ii
Property of BOCOO Online (Beijing) Ltd
协议概述 第一章 AMF 协议概述
AMF(是 Action Message Format 的缩写)是在 flash 或 flex 中 remoting 的一种二 进制通信协议。AMF 协议在 Flash Remoting 中是一个核心协议。基本上 AMF 协议 规定了 Flash Remoting 的所有工作。这个协议开始就可以以 XML 或者“变量/值" 键值对等输出格式向服务器传送数据。 AMF 最大的特色在于可直接将 Flash 内置对象,例如 Object,Array,Date,XML,传 回服务器端,并且在服务器端自动进行解析成适当的对象。同时服务器端的对象也 可以直接发送给 Flex。在 Flex 中就像使用内置对象一样使用服务器返回的对象。 这就减轻了开发人员繁复
工作,同时也更省了开发时间。 由于 AMF 协议采用二进制编码,这种方式可以高度压缩数据,因此非常适合用 来传递大量的资料。数据量越大,Flash Remoting 的传输效能就越高,远远 超过 WebService。至于 XML,LoadVars 和 loadVariables(),它们使用纯文本的传输方式,效 能就更不能与 Flash Remoting 相提并论了。同时采用二进制传输数据也相比 xml 的 明码传输数据要安全。
Confidential Information 3
Property of BOCOO Online (Beijing) Ltd
第二章 Flex 与 ROR 交互方法
一、支持 Flex 与 ROR
通信的插件
在目前比支持 Ruby 和 Flex 采用 AMF 协议通行的插件有两个: 1.RubyAMF(blog.rubyamf.org) 2.WebOrb(themidnightcoders/products/
weborb-forrails/overview.html)
以上两个插件的工作原理大致如下: 1、拦截 Flex 发送的请求 2、解析请求为 Ruby 认识的数据 3、分发请求给 ROR 处理 4、包装 ROR 返回的数据为二进制数据响应给 Flex 5、Flex 接受数据并处理数据,呈现给用户
比较 RubyAMF 和 WebORB 在编写代码方面的优点,RubyAMF 只需要编写更 少的代码就可以实现和 WebORB 同样的功能。也就是说 RubyAMF 开发的效率更 高,鉴于此以下将只是具体讲述使用 RubyAMF 在 Flex 和 ROR 中的传输过程。
二、RubyAMF 与 ROR 的通信方式详解
1) 交互结构 交互结构
如图 1 中所示,通信过程分为两层。即客户端和服务器端,中间通过 http 协议 传输 AMF 协议的二进制流。
Confidential Inf
ormation 4
Property of BOCOO Online (Beijing) Ltd
(图一)
客户端主要是指 Flex
程序,同主要是接受用户动作,根据不同的用户动作, 向服务器放送不同的请求。在此结构中,与传统结构不同的是 Flex 请求的地址 (网关)是唯一的。传统结构是不同动作请求不同地址。这个唯一的网关就是图中 的 Flash Remoting。由它来解析 Flex 发送的信息,再去请求不同的 ROR 方法。 服务器端由传统的单 ROR 机构变成 ROR + Flash Remoting 机构。 Flash Remoting 在最前端截取所有 Flex 发送的请求,将二进制请求转换成 ROR 能处理的 请求,再路由给 ROR 去处理。再 ROR 处理完成后,将相应的结构发送给 Flash Remoting,由它将相应包装成二进制流发送到客户端。 从宏观上来看,Flex 是不知道服务器端是如何处理的,它在交互过程中唯一要 做的事情就是去发送请求、等待并接受数据。就好比服务器端是一个大型的对象数 据库,只要用双方约束好的语言交流就能得到相