/// <summary> /// 发送消息。 /// </summary> /// <param name="msg"></param> private void SendMessage(RecvBuffer msg) { //try //{ NetReadBuffer buffer = NetReadBuffer.CacheBuff; buffer.Init(msg.data, 0, msg.length); //LogMgr.Log("msg.cmd " + msg.cmd); MsgExHandler exhandler; if (msgExHandlers.TryGetValue(msg.cmd, out exhandler)) { exhandler(buffer); return; } Type tp; if (msgTypes.TryGetValue(msg.cmd, out tp)) { //走C#层 解包消息 MsgData msgdata = Activator.CreateInstance(tp) as MsgData; msgdata.unpack(buffer); //接收调用 MsgHandler handlerEvent; if (msgHandlers.TryGetValue(msg.cmd, out handlerEvent)) { handlerEvent(msgdata); } else { #if UNITY_EDITOR LogMgr.Log("NetClient.dispatchMsg Failed ,Unknow NetMessage Recevied cmd:{0}", msg.cmd); #endif } } else { //走Lua层 OnLuaDispatchMsg(msg.cmd, buffer); } //} //catch (Exception e) //{ // LogMgr.LogError(e.Message); //} }
/// <summary> /// 分发收到的网络消息(主线程中调用)。 /// </summary> protected void dispatchMsg() { //先将消息缓冲到临时列表,然后清空临界区列表,再通过临时列表派发,防止消息在派发时报错跳出,导致无法从列表里移除一直报错 int n = 2; //每帧最多处理2个消息 //Debug.Log("recvMsgs.Count " + recvMsgs.Count); for (int i = 0; i < n; ++i) { RecvBuffer m = null; lock (recvMsgs) { if (recvMsgs.Count > 0) { m = recvMsgs.Dequeue(); } } if (m == null) { return; } //消息派发 if (m.cmd == NetMsgDef.S_HEART_BEAT) { //心跳 NetReadBuffer buf = NetReadBuffer.CacheBuff; buf.Init(m.data, 0, m.length); NetMgr.CacheRecvHeartBeat.unpack(buf); CoreEntry.netMgr.OnReceiveHearBeat(m.tick, NetMgr.CacheRecvHeartBeat); } else if (m.cmd == NetMsgDef.S_FRAME_MSG) { //合并包 UnpackFrameMessages(m, SendMessage); } else { SendMessage(m); } cacheRecvMsgs.Cache(m); } }