撸个服务端出来系列(一)
作为一个干了快一年半的客户端。有时候我总是在想游戏的服务端是怎么实现的呢~或者说我要如何撸出一个服务端来呢?
由于之前有做web的经验和大学时写过一个聊天室程序。我想大不了是个实现在tcp上的长连接嘛。
嗯!首先我要实现两端通信(这不是废话嘛)。
我列了下初期要做的工作大致是
1.技术的选型。由于我最熟悉的客户端是cocos2dx,最熟悉的服务端语言是java。ok那拍了下脑袋就用这两个吧。
2.定制一个交互协议。根据我写客户端的经验。一般搞安卓和ios的服务端的人都喜欢丢个xml或者json给你解析。为嘛?简单呗。不过由于我写的是游戏,而且是跨语言的通信xml和json似乎都是还不错的选择。但毕竟咱们这个是带有实践性的技术研究。所以我设计了如下的报文格式。
int 协议号 | short 消息体长度 | byte[] google buffer |
为啥我采用了google buffer呢。实际上我是为了偷懒。你要知道如果我每个协议都定义了一个具体的消息体结构。那我就要把它翻译成两种语言。无疑在效率上是很傻逼的一件事,而且根据我的实际开发经验,往往协议翻译出错,导致的问题要么很容易排查,要么很难找到问题。而且google buffer的原理和压缩。可以使得在性能上不是特别下降的情况下,能够压缩我的协议。有兴趣的同学可以学习下google buffer
这里提供一篇IBM原理性的文章
http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
3.跨平台通信的问题解决。有人会问。你不是用google buffer了麽。不过你要知道我的协议号和消息长度两个可不是google buffer。这里我们需要解决1).大小端通信的问题.2)粘包和丢包的处理。这部分可以去参考网上许多的博客。还有Netty的教程(其实我一开始是用mina的。至于为啥不用java socket和nio 因为我一开始写的聊天室,每次都要启动一个线程维护一个session,原来还有多路复用的技术~ ~,至于nio因为即使给我直接用nio我也不一定能很方便的写出东西,在探究东西上和干活效率上总有个平衡点嘛)。
https://github.com/waylau/netty-4-user-guide