/* * build = proto.Build(); * build.WriteTo(stream); * mess.buff = stream.ToArray(); */ public void Write(CSMsg rCSMsg) { //序列化数据把数据库发送出去 CSMsg.Builder proto = CSMsg.CreateBuilder(); MemoryStream stream = new MemoryStream(); rCSMsg = proto.Build(); rCSMsg.WriteTo(stream); byte[] buff = stream.ToArray(); //先处理头部,把头部字节数转换成网络字节序 short x = (short)buff.Length; ushort b = (ushort)System.Net.IPAddress.HostToNetworkOrder(x); //把x转成相应的大端字节数 byte[] intBuff = System.BitConverter.GetBytes(b); //这样直接取到的就是大端字节序字节数组。大端字节序就是网络字节序 //把头部和包体字节保存在一个数组中。 byte[] sendbuff = new byte[intBuff.Length + buff.Length]; Array.Copy(intBuff, sendbuff, intBuff.Length); //先把头部int字节 拷贝到sendbuff Array.Copy(buff, 0, sendbuff, intBuff.Length, buff.Length); //在把数据包字节拷贝到sendbuff数组中 try { socket.Send(sendbuff); }catch (Exception e) { Debug.Log("网络错误,请重新登录" + e.Message); } }
void Update() { //每一帧查看是否有消息需要处理 while (NetIO.Instance.messages.Count > 0) { CSMsg model = NetIO.Instance.messages[0]; StartCoroutine("MessageReceive", model); //创建一个携程,相当于一个线程 NetIO.Instance.messages.RemoveAt(0); } }
//下面就是该模块各个功能的逻辑处理 public void OnLogin(CSMsg rModel) { if (rModel.Body.RegisterLoginRsp.RspParam.LoginRsp.Type == 3) { //登录成功就要初始化role数据 RoleData.Instance().SetDBRoleInfo(rModel.Body.RegisterLoginRsp.RspParam.LoginRsp.Role); } return; }
public static CSMsg mdecode(byte[] value) //反序列化protobuf得到真正的数据 { CSMsg.Builder builder = new CSMsg.Builder(); if (builder.MergeFrom(value) == null) { Debug.Log("反序列化protobuf 失败 !"); } CSMsg Data = builder.Build(); return(Data); }
public void MessageReceive(CSMsg model) //封装接口函数 { switch (model.Body.BagRsp.Cmd) //访问模块的子功能 { case CSBagCmd.CSBagCmd_Fetch: //背包界面显示功能 OnFetch(model); break; case CSBagCmd.CSBagCmd_Use: //背包物品的使用功能 OnBagUse(model); break; } return; }
public void MessageReceive(CSMsg model) //封装接口函数 { switch (model.Body.DecorateBagRsp.Cmd) //访问模块的子功能 { case CSDecorateBagCmd.CSDecorateBagCmd_Fetch: // 装饰背包界面显示功能 OnFetch(model); break; case CSDecorateBagCmd.CSDecorateBagCmd_ShowSet: //装饰背包显示设置物品装饰 OnShowSet(model); break; case CSDecorateBagCmd.CSDecorateBagCmd_VipFetch: //VIP装饰背包界面展现功能 OnVipFetch(model); break; } return; }
public class LoginHandler : MonoBehaviour, IHandler { //每个模块都会继承IHandler接口 public void MessageReceive(CSMsg model) //封装接口函数 { switch (model.Body.RegisterLoginRsp.Cmd) //访问模块的子功能 { case CSRegisterLoginCmd.CSRegisterLoginCmd_Login: // 登录模块 OnLogin(model); //登录模块要处理的逻辑 break; case CSRegisterLoginCmd.CSRegisterLoginCmd_Register: //注册模块 OnRegister(model); break; case CSRegisterLoginCmd.CSRegisterLoginCmd_Quit: //退出模块 OnQuit(model); break; } return; }
//缓存中有数据处理 void onData() { //长度解码 byte[] result = decode(ref cache); //长度解码返回空 说明消息体不全,等待下条消息过来补全 if (result == null) { isReading = false; return; } CSMsg message = mdecode(result); if (message == null) { isReading = false; return; } //进行消息的处理,把消息压入一个容器中 messages.Add(message); //尾递归 防止在消息处理过程中 有其他消息到达而没有经过处理 onData(); }
public void OnVipFetch(CSMsg rModel) { return; }
public void OnShowSet(CSMsg rModel) { return; }
void MessageReceive(CSMsg model) { IHandler rHandler = rHadlerList.GetHandler(model.Head.MsgID); //根据模块号去调用对应的模块功能 rHandler.MessageReceive(model); //跳转到逻辑功能上 }
public void OnQuit(CSMsg rModel) { return; }
public void OnRegister(CSMsg rModel) { return; }
public void OnBagUse(CSMsg rModel) { return; }