主要介绍流程,不写代码
首先是最基础的socket框架搭建
大部分代码是一成不变的,大家可以下一些服务器的源码看一下,就算看不懂也没关系,我们只需要了解处理消息的部分,也是接下来要讲的
要进行通信,首先要定义传输模型,即传什么
传输模型大体包含四个部分
TYPE:类型,战斗模块,登录模块,用户模块等
AREA:区域,这个区域并不是只包含角色所在区域信息,他其实是第一个层级TYPE的细分,比如,如果TYPE是用户模块,则AREA这里会将其细分为装备模块,技能模块等
COMMAND:命令,这个就好理解了,就是要调用哪个函数
Message:信息,这个就是上个层级函数的参数,一般以类的方式传输,比如要注册账号,我们这里就要放一个类似这样的实例
Class a
{
userID = 1;
username = “aaa”;
password = “bbb”;
}
下面举个例子
比如角色进行了一个攻击动作,要通知其他玩家,首先,攻击属于战斗模块,其次,我们要取得角色所在的区域,一般mmorpg会把地图分为好多区域,一个人动了一下只要让能看到他的人知道就行了,没必要让全世界玩家都知道,然后,我们要让他调用attack函数,最后再传入用户信息等
需要注意的是,这4个层级并不会都用到,用不到的置空就行了
前三个层级会传数字,比如客户端和服务器端都定义好了
USER = 0
Skill = 0
Equip = 1
BATTLE = 1
Attack = 0
Defend = 1
接下来就是怎么传
传之前我们会把第四个层级的类对象进行序列化,即以转化为0和1的形式
为了效率,会进行粘包和拆包的处理
粘包 如果我们把一次传输的字节数设为1024
我们会声明一个1024大小的字节数组,当有一个传输模型要发送时,我们先写入这个模型的大小,在写入传输模型,如果不够1024,等待下一条,如果超出1024,则会先把这个1024发出去,把余下的写入下一个1024
拆包则相反
这里我只是简单的介绍一下,如果逻辑考虑全是很麻烦的,具体可见我以前写的http://blog.csdn.net/ymiku/article/details/45937673,有点乱
这里说一下数据的存储,这里一般会设置一个缓存层,如果要更改数据,更改数据库及缓存层,如果取数据,直接从缓存层拿,就不用去数据库找了
最后就是信息的处理
我们会把获得的消息存到一个队列中,然后每一帧递归解析所有的消息