Ejemplo n.º 1
0
        /// <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);
            //}
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }