深蓝居

关注MS的VS2008和SQL Server 2008

常用链接

统计

积分与排名

朋友

学习生活

最新评论

AMF学习2远程调用的封装

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

  • 【出自博客园深蓝居,转载请注明作者出处】

    posted on 2008-04-11 01:58 深蓝 阅读(195) 评论(4)  编辑 收藏 所属分类: .Net开发杂项

    评论

    #1楼  2008-04-26 10:32 六道轮回 [未注册用户]

    最近我也在玩纵横。 hehe   回复  引用    

    #2楼  2008-04-26 10:34 六道轮回 [未注册用户]

    使用Java的BlazeDS可以直接和纵横服务器通信。能够自动完成数据打包和拆包。   回复  引用    

    #3楼  2008-07-01 20:59 benlei [未注册用户]

    请问你还在研究这个游戏吗?
    我有些问题是否可以咨询你呢?   回复  引用    

    #4楼  2008-07-10 08:47 benlei [未注册用户]

    我现在对这几个问题还不是很明白:
    1.编写这个游戏的辅助工具用什么开发工具呢?是用Flex Builder吗?
    2.如果是用Flex Builder或者其它的,请问在代码里怎么和服务器通信呢?如登录服务器,调用远程函数,取得服务器返回结果。关于这方面是否方便给我个例子参考下?
    3.关于纵横天下的数据,我搞清楚了一些,但有些还是不太清楚,比如(Target的内容:“/79”) 是什么,79从哪里来的?不知道你是否有更详细的分析,可以给我讲讲或者参考下么?

    PS:请问你是四川人么---看你给我信里的回复感觉你像是四川人。

    谢谢,盼回复!   回复  引用    


    标题  
    姓名  
    主页
    Email (博主才能看到) 
    验证码 *  看不清,换一张 [登录][注册]
    内容(请不要发表任何与政治相关的内容)  
      博客园首页

      新闻频道

      社区

      小组

      博问

      网摘

      闪存

      登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
    该文被作者在 2008-04-11 02:03 编辑过
    成果网帮您增加网站收入


    相关链接:
     

    我要啦免费统计