SmartFoxServer 2X 笔记二:协议分析(转)

这里是原文链接

 

    之前的项目都是用 SmartFoxServer 1X 写的,所以之前用 Pythone 实现过一个 SmartFoxServer 1x 的客户端 SDK。有兴趣
的可以移步 pySmartFoxClient 阅读源代码。自从 SmartFoxServer 2X 发布之后,便开始研究,正好最近公司决定将原来基于 1x 的
应用进行基于 2x 的重构,这样也想用 Python 再搞一套 SmartFoxServer 2X 的客户端 SDK。不过,这个比 1x 来说难度增加了不少,因为 2X 的数据传输是二进制协议的,不清楚它的协议结构一切都等于零。还是从抓包开始吧。

    这里需要特别感谢 golastroom的空间 这个博客的帮助,是这个博客上的文章让我从完全摸不着头脑慢慢渐入佳境的。还有就是 SmartFoxServer 2x 的 Java 客户端 API 也发布了 Beta 版本,不过这次比较吝啬没有发布源代码而是只发布了 jar 包(原来的 1x 版本的 Java API 是有源代码包的),这可能也是为了保护它们新的二进制协议的缘故吧。不过通过 Java Decompiler 所提供的反编译工具还是能了解一下协议的大致结构的,不过要想完全了解也需要费一番周折的。

    不再废话,这里先给出协议的大致结构,然后再慢慢解释。

        协议结构:    | 协议头 | 数据长度 | 数据类型 | 数据个数 | 具体数据 |
        字段长度:    | 1 字节 | 2~4字节 |  1 字节  | 2 字节  | 若干字节 |

    协议头用来说明协议本身的一些属性和结构的,占1字节共8位,用前五位的高低位分别来表示是否为二进制数据、是否加密、是否进行压缩、是否使用 BlueBox、是否为 BigSize 数据。

    例如一个协议头为 100000000 则说明这个协议头所属的数据包是二进制数据、没有加密、没有进行过压缩、没用使用 BlueBox、不是 BigSize 数据。这里需要特别说明一下什么是 BigSize 数据。这个属性和整个协议的第二个字段“数据长度”有关,当一个协议数据包发来的数据过大时,数据长度需要用 Integer 类型表示,这时协议头的 BigSize 位为 1 ,协议的第二字段“数据长度”占4字节;若数据包的数据不大时协议头的 BigSize 位为 0,数据长度用 Short 类型表示,协议的第二字段“数据长度”占2字节。

    说完协议头和数据长度的表示,下面是协议的第三个字段“数据类型”。这1字节数据用于表示数据包中的数据应用什么数据类型进行解析,该字节数据和所代表的数据类型的对应关系如下:

       
 数值 数据类型
 0 NULL
 1 Boolean
 2 Byte
 3 Short
 4 Integer
 5 Long
 6 Float
 7 Double
 8 UTF String
 9 Boolean Array
 10 Byte Array
 11 Short Array
 12 Integer Array
 13 Long Array
 14 Float Array
 15 Double Array
 16 UTF String Array
 17 SFSArray
 18 SFSObject
 19 Class

  
    协议的第四字段“数据个数”,这个我是针对当协议第三字段为 18 SFSObject 时分析的,其他的情况我还没有抓包分析,所以这里我们只讨论当数据类型为 SFSObject 时候的情况。通过文档我们不难知道 SFSObject 实际上是一个类似 Key/Value 的哈希结构。所以这里的“数据个数”所表示的就是本次数据 SFSObject 中 Key 的个数。该字段占2字节为 Short 类型。

    这时前四个字段已经全部解析完了,数据的结构已经完全清楚了,接下来就是具体解析真实数据的环节了。我们通过第四个字段得知了“数据个数”,这时候需要通过这个“数据总数”来循环遍历剩下的数据以最终得到我们需要的数据对象。我们还是以 SFSObject 类型的数据进行分析,每次循环遍历的工作过程是这样的。

    先取得2字节 Short 类型数据,该数据表示当次循环要取得的 SFSObject 对象的 Key 的长度。我们暂时定义它为 keyLen,得到 keyLen 的值后,接着取 keyLen 个字节的 String 类型数据,该数据就是当次循环要取得的 SFSObject 对象的 Key 的值。

    取得了 Key 的值后,取得 Value 的过程和取得 Key 的差不多。差别就在于 Key 的类型是固定的,是 String 类型。而 Value 的类型就不一定了,所以还是要先取得1字节数据的数值,然后通过上面那个表来确定 Value 的数据类型,确定了 Value 的数据类型,接下来就很容易取得 Value 的真实数值了。

    最后说一下十分重要的注意事项。在实际分析过程中发现协议第二字段“数据大小”的值很有意思,我以2字节的 Short 举例。去除协议头的1字节后,数据大小这个字段应该是第2和第3两个字节组成的 Short 数据。但事实并非如此,我发现第2和第3字节组成的数据并不对,通过实验得知,需要将两字节的数据倒置才能得到真正的数据大小的数值。也就是说 数据大小 = 第3字节 + 第2字节 这个比较诡异。

    作为 SmartFoxServer 2x 协议分析的第一篇,这次只是相当简单的对协议的大致结构做了一次初步的探索。只是简单的分析了一两个结构简单,数据量小的数据包,要想彻底分析和掌握整个协议还需要大量的研究工作,我会继续研究下去,也希望有兴趣的同学一起参与哦。先到这。

转载于:https://www.cnblogs.com/xanqi/archive/2012/11/29/2794614.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值