十一后将要做手机网络游戏,可我从来都不玩网络游戏,更何况是手机网络游戏,所以周五下班后准备下一款手机网络游戏来见识见识。听说神役不错,于是就到捉鱼和掌控的的WAP网站上下,但是下了N次都是失败,我的手机可是3230的标准机型!没办法只好去下青龙珏,老是下到一半就断掉了。唉,移动的破网这想下都下不下来,用户体验太差了。于是破罐破摔能下谁下谁吧,搞了两三个小时都没搞定,最后偶然把武林擂下了两次竟然下下来了,精神陡然为之一振,倒霉的武林擂就拿你开刀吧!
先玩了一遍,有很多地方可圈可点的,细节也很注意,看的出来掌上明珠是花了一定的心思的。等上手了之后我又拿L7下了一个,两个机型放在一起比较网络延迟,发现了许多有趣的设计,比如消息优先级,你会发现玩家移动的距离越远则被广播的可能性越大,这些使我对这款游戏产生了很大的兴趣,于是决定反编译他的字节码看个究竟。
花了两天周末的时间,搞的天旋地转的,总算搞定了他的框架和网络协议,做了个注册机在模拟器上自动注册了从cocomo2到cocomo10的账号。网络协议的加密工作做的真的是太差劲了,几乎没有什么加密,CRC效验码也做的不伦不类,仅对每个待发送的字节做异或处理,一开始还奇怪这是什么呢,后来才想起来估计是CRC效验码的变态版^_^。这样的协议设计幸亏我心地善良,否则服务器早就爆掉了。下例是一个消息的封包,封包消息17代表注册用户消息:
k k1 = new k((byte)17);
k1.aWriteString("cocomo11");
k1.aWriteString("19842196");
k1.a((short)0);
k1.a(1517);
k1.aWriteString("NK-6600");
k1.aWriteString(str);
k1.aWriteString("");
k1.flush();
他的架构很奇怪,一开始一直搞不明白,类之间跳来跳去的,N个线程不停的开,不停的关。搞了一天一夜才弄明白:一开始他用HttpConnection连接服务器 http://211.100.18.94:7000/wulinipd/serverlist3?type=tcp,获得一个服务器列表:
MSISDN=
但是由于武林擂是用socket连接,所以网络层b类有两个内部类线程d和e,d用来做数据读取,e用来做数据发送,就像两个轮子一样,达到双工的效果。b类上层数据层是k类,用来组装消息。k类上层是c类,a类和m类联合组成了应用层。m类是从Canvas继承来的主线程,他会触发c类线程,c类线程不循环,他在需要接受和发送数据时会触发b类线程,b类线程会触发自己的内部类d线程和e线程,自己却join掉。所以发送和接收数据的线程并不是一直循环的,而是在需要的时候被触发,但是网络游戏这样频繁的发送数据,就会频繁的start线程,这样做有什么好处吗?
武林擂这个游戏的架构设计的还是很有意思的,不过我一直认为有些地方线程可以精简,没有必要开启那么多线程,有资源浪费之嫌,也可能我还没有理解他的精妙之处,如果有兴趣的朋友可以跟我联系。
先玩了一遍,有很多地方可圈可点的,细节也很注意,看的出来掌上明珠是花了一定的心思的。等上手了之后我又拿L7下了一个,两个机型放在一起比较网络延迟,发现了许多有趣的设计,比如消息优先级,你会发现玩家移动的距离越远则被广播的可能性越大,这些使我对这款游戏产生了很大的兴趣,于是决定反编译他的字节码看个究竟。
花了两天周末的时间,搞的天旋地转的,总算搞定了他的框架和网络协议,做了个注册机在模拟器上自动注册了从cocomo2到cocomo10的账号。网络协议的加密工作做的真的是太差劲了,几乎没有什么加密,CRC效验码也做的不伦不类,仅对每个待发送的字节做异或处理,一开始还奇怪这是什么呢,后来才想起来估计是CRC效验码的变态版^_^。这样的协议设计幸亏我心地善良,否则服务器早就爆掉了。下例是一个消息的封包,封包消息17代表注册用户消息:
k k1 = new k((byte)17);
k1.aWriteString("cocomo11");
k1.aWriteString("19842196");
k1.a((short)0);
k1.a(1517);
k1.aWriteString("NK-6600");
k1.aWriteString(str);
k1.aWriteString("");
k1.flush();
他的客户端是一个瘦客户机的设计,在jar包中绝对见不到大量的图片和资源文件,都在服务器端存放,即时下载,这样可以把jar做的很小,便于下载,这样的客户端变得更像一个脚本引擎了。
他的架构很奇怪,一开始一直搞不明白,类之间跳来跳去的,N个线程不停的开,不停的关。搞了一天一夜才弄明白:一开始他用HttpConnection连接服务器 http://211.100.18.94:7000/wulinipd/serverlist3?type=tcp,获得一个服务器列表:
MSISDN=
华山之巅(良好)=socket://218.206.86.118:7777
昆仑论剑(满)=socket://211.136.83.106:7777
武林至尊(满)=socket://218.206.86.118:7777
登陆官网
然后选择服务器就用socket来连接咧,这招太狠了。
像神役和屠魔因为都是用httpConnection做连接,所以底层网络层是一个线程不停的在循环做数据接收和数据发送,网络层上层是数据层用来封包和解包,数据层上层是应用层,也就是从Canvas派生出来的那个类。
但是由于武林擂是用socket连接,所以网络层b类有两个内部类线程d和e,d用来做数据读取,e用来做数据发送,就像两个轮子一样,达到双工的效果。b类上层数据层是k类,用来组装消息。k类上层是c类,a类和m类联合组成了应用层。m类是从Canvas继承来的主线程,他会触发c类线程,c类线程不循环,他在需要接受和发送数据时会触发b类线程,b类线程会触发自己的内部类d线程和e线程,自己却join掉。所以发送和接收数据的线程并不是一直循环的,而是在需要的时候被触发,但是网络游戏这样频繁的发送数据,就会频繁的start线程,这样做有什么好处吗?
武林擂这个游戏的架构设计的还是很有意思的,不过我一直认为有些地方线程可以精简,没有必要开启那么多线程,有资源浪费之嫌,也可能我还没有理解他的精妙之处,如果有兴趣的朋友可以跟我联系。