一:说明
我致力于Unity客户端开发已有3年,而2016到2017都是在使用probuffer作为前后台通信协议,不过本人不是很想学习js,所以我选择Scut作为自己的练习的服务器。下面是我对ScutNetClient造的一个轮子。
二:归纳
归纳一下Unity客户端网络通信必须要做的事情:通信协议制定、粘包、拆包、封包、解包、网络包状态、连接状态、请求--响应行为、事件推送、心跳以及几个可选的压缩、加密、解密、断线重连。
三:协议规则
记录几个比较重要的协议
ActionId:Int类型,表示请求需要指定哪个Action处理请求,特定值:1为心跳包请求编号,2为连接中断请求编号,1000以下编号提供给Scut引擎预留使用
MsgId:>0为请求协议号,==0为服务器推送协议号
https://github.com/ScutGame/Scut/wiki/ActionContract
四:粘包、拆包
目前粘包、拆包大部分的解决方案大部分都是增加消息内容长度,用特殊符号分割的我目前还没有见到过。主要思路是记录包的总长度 TotalLength,当前位置索引CurPos,以及读取状态(读取Head,读取Body)
void ProcessBytes(byte[] data, int offset, int len)
{
if (mReadState == eReadState.ReadHead)
{
ReadHead(data, offset, len);
}
else if (mReadState == eReadState.ReadBody)
{
ReadBody(data, offset, len);
}
}
void ReadHead(byte[] data, int offset, int len)
{
mPackLength = BitConverter.ToInt32(data, offset); // 包的长度
//Debug.Log("limit:" + len + " Offset:" + offset + " Length:" + mPackLength);
mBuffers = new byte[mPackLength];
int realLen = len - offset;
if (realLen >= HEAD_CO