Exemple #1
0
        // 缓存回调列表移到真实回调列表
        private static void RegisterHooksTempToRealHooks()
        {
            if (g_DataHook == null)
            {
                g_DataHook = new Dictionary <eMsgTypes, List <int> >();
            }

            Dictionary <eMsgTypes, List <int> > .Enumerator iter = g_DataHookAddTemp.GetEnumerator();
            while (iter.MoveNext())
            {
                List <int> listHookTemp = iter.Current.Value;
                eMsgTypes  key          = iter.Current.Key;
                int        nTempCount   = listHookTemp.Count;
                for (int nCntTemp = 0; nCntTemp < nTempCount; nCntTemp++)
                {
                    int nHookIndex = listHookTemp[nCntTemp];
                    if (!g_DataHook.ContainsKey(key))
                    {
                        g_DataHook[key] = new List <int>();
                    }
                    List <int> listHook = g_DataHook[key];
                    if (listHook.Contains(nHookIndex) == false)
                    {
                        listHook.Add(nHookIndex);
                    }
                }
            }
            iter.Dispose();
            g_DataHookAddTemp.Clear();
        }
Exemple #2
0
 // 回调事件
 private static void DispatchEvent(eMsgTypes type, object Info)
 {
     if (g_DcHook.ContainsKey(type) == true)
     {
         g_DcHook[type](type, Info);
     }
 }
Exemple #3
0
 /// <summary>
 /// 反注册DC
 /// </summary>
 public static void AntiRegisterDCHooks(eMsgTypes type)
 {
     if (g_DcHook.ContainsKey(type) == false)
     {
         g_DcHook.Remove(type);
     }
 }
Exemple #4
0
 /// <summary>
 ///   登入GS 回调
 /// </summary>
 // 保存登录gs 服务器消息
 public static void RecvMsgGS2CLLoginReply(eMsgTypes Type, object Info)
 {
     if (Info == null)
     {
         return;
     }
     g_GSLogin = Info as ProtoMsg.MsgCl2gsLoginReply;
     IGGDebug.Log("连接游戏服务器成功");
 }
Exemple #5
0
        public static void RecvMsgClientKeepLive(eMsgTypes Type, object Info)
        {
            if (Info == null)
            {
                return;
            }
            MsgClientKeepLive g_KeepLive = Info as ProtoMsg.MsgClientKeepLive;

            SendKeepLiveMsg();
        }
Exemple #6
0
 /// <summary>
 ///   请求登入回调
 /// </summary>
 public static void RecvMsgLS2CLLoginReply(eMsgTypes Type, object Info)
 {
     if (Info == null)
     {
         return;
     }
     g_LSLogin = Info as ProtoMsg.MsgCl2lgLoginReply;
     IGGDebug.Log("连接登入服务器成功");
     // 请求链接GS
     LoginM.ConnectGameServer();
 }
Exemple #7
0
        public static void RecvMsgGS2CLServerTimeNotice(eMsgTypes Type, object Info)
        {
            if (Info == null)
            {
                return;
            }

            /*MsgGS2CLServerTimeNotice data = (MsgGS2CLServerTimeNotice)Info;
             * m_LastGameTime = data.server_time * 1000;
             * m_LastTime = System.DateTime.Now.Ticks / 10000;*/
        }
Exemple #8
0
        /// <summary>
        /// 消息到达的处理
        /// </summary>
        /// <param name="msg">到达的消息</param>
        public static void MsgArrival(int msg)
        {
            eMsgTypes Type = (eMsgTypes)msg;

            //IGGDebug.Log("MsgArrival prev:" + Type);
            if (!msgWainList.ContainsKey(msg))
            {
                // 无人等待此消息
                return;
            }
            //IGGDebug.Log("MsgArrival:" + Type);
            // 添加到列表中
            arrivalList.Add(msg);
        }
Exemple #9
0
 private static void AntiRegisterHooksFrDelTemp()
 {
     Dictionary <eMsgTypes, List <int> > .Enumerator iter = g_DataHookDelTemp.GetEnumerator();
     while (iter.MoveNext())
     {
         List <int> listDelHook = iter.Current.Value;
         eMsgTypes  key         = iter.Current.Key;
         int        nDelCount   = listDelHook.Count;
         for (int nDelCnt = 0; nDelCnt < nDelCount; nDelCnt++)
         {
             int nDelHookIndex = listDelHook[nDelCnt];
             if (g_DataHook.ContainsKey(key))
             {
                 List <int> listHook = g_DataHook[key];
                 if (listHook.Contains(nDelHookIndex) == true)
                 {
                     listHook.Remove(nDelHookIndex);
                 }
                 int nCount = listHook.Count;
                 if (nCount == 0)
                 {
                     g_DataHook.Remove(key);
                 }
             }
             else
             {
                 g_DataHook.Remove(key);
             }
             if (g_DataHookAddTemp.ContainsKey(key))
             {
                 List <int> listHookTemp = g_DataHookAddTemp[key];
                 if (listHookTemp.Contains(nDelHookIndex) == true)
                 {
                     listHookTemp.Remove(nDelHookIndex);
                 }
                 int nCount = listHookTemp.Count;
                 if (nCount == 0)
                 {
                     g_DataHookAddTemp.Remove(key);
                 }
             }
             else
             {
                 g_DataHookAddTemp.Remove(key);
             }
         }
     }
     iter.Dispose();
     g_DataHookDelTemp.Clear();
 }
Exemple #10
0
        /// <summary>
        /// 注册服务端触发事件
        /// </summary>
        public static void RegisterHooks(eMsgTypes type, DataHook pf)
        {
            if (pf == null)
            {
                IGGDebug.Log("注册的Hook 非法");
                return;
            }

            bool bHaveDataHook = false;
            int  nAddHookIndex = 0;

            Dictionary <int, DataHook> .Enumerator iter = g_IndexDataHook.GetEnumerator();
            while (iter.MoveNext())
            {
                if (iter.Current.Value == pf)
                {
                    bHaveDataHook = true;
                    nAddHookIndex = iter.Current.Key;
                    break;
                }
            }
            iter.Dispose();



            if (!bHaveDataHook)
            {
                g_IndexDataHook[g_nHookIndex] = pf;
                nAddHookIndex = g_nHookIndex;
                g_nHookIndex++;
            }

            if (g_DataHookAddTemp == null)
            {
                g_DataHookAddTemp = new Dictionary <eMsgTypes, List <int> >(new msgtypeMsgTypeComparer());
            }


            if (!g_DataHookAddTemp.ContainsKey(type))
            {
                g_DataHookAddTemp[type] = new List <int>();
            }
            List <int> listHookTemp = g_DataHookAddTemp[type];

            if (!listHookTemp.Contains(nAddHookIndex))
            {
                listHookTemp.Add(nAddHookIndex);
            }
        }
Exemple #11
0
        public static bool ProcessData(eMsgTypes Type, byte[] data, int index, int length)
        {
            object obj = protobufM.Deserialize(Type, data, index, length);

            if (obj == null)
            {
                return(false);
            }
            //  派发到DC中进行存储
            DispatchEvent(Type, obj);
            // 派发消息用
            EventCenter.DispatchEvent(Type, obj);

            return(true);
        }
Exemple #12
0
        /// <summary>
        /// Send2s the G.
        /// </summary>
        /// <returns><c>true</c>, if G was send2ed, <c>false</c> otherwise.</returns>
        /// <param name="msgNo">Message no.</param>
        /// <param name="data">protobuf object.</param>
        public static bool Send2GS(eMsgTypes type, byte[] msg)
        {
            //IGGDebug.Log("send:" + type);
            NetBuffer Nb = NetCache.GetNetBuffer(msg.Length);

            if (Nb != null)
            {
                Nb.PackBuf(type, msg);
                return(gsConnector.SendToServer(Nb));
            }
            else
            {
                return(false);
            }
        }
Exemple #13
0
        /// <summary>
        /// 反注册服务端通知事件
        /// </summary>
        public static void AntiRegisterHooks(eMsgTypes type, DataHook pfRemove)
        {
            if (pfRemove == null)
            {
                return;
            }

            bool bHaveDataHook   = false;
            int  nRemovHookIndex = 0;

            Dictionary <int, DataHook> .Enumerator iter = g_IndexDataHook.GetEnumerator();
            while (iter.MoveNext())
            {
                if (iter.Current.Value == pfRemove)
                {
                    bHaveDataHook   = true;
                    nRemovHookIndex = iter.Current.Key;
                    break;
                }
            }
            iter.Dispose();


            if (!bHaveDataHook)
            {
                return;
            }
            g_IndexDataHook.Remove(nRemovHookIndex);

            if (g_DataHookDelTemp == null)
            {
                g_DataHookDelTemp = new Dictionary <eMsgTypes, List <int> >(new msgtypeMsgTypeComparer());
            }

            if (!g_DataHookDelTemp.ContainsKey(type))
            {
                g_DataHookDelTemp[type] = new List <int>();
            }
            List <int> listHookTemp = g_DataHookDelTemp[type];

            if (listHookTemp.Contains(nRemovHookIndex) == false)
            {
                listHookTemp.Add(nRemovHookIndex);
            }
        }
Exemple #14
0
    public static void Init()
    {
        eMsgTypes test = new eMsgTypes();

        System.Reflection.FieldInfo[] fieldInfos = typeof(eMsgTypes).GetFields();
        int FieldCount = fieldInfos.Length;

        g_TypeDict = new Dictionary <eMsgTypes, Type>(FieldCount, new msgtypeMsgTypeComparer());
        for (int i = 1; i < FieldCount; ++i)
        {
            System.Reflection.FieldInfo FiledName = fieldInfos[i];
            eMsgTypes msgt = (eMsgTypes)FiledName.GetValue(test);
            Type      t    = Type.GetType(FiledName.Name.Replace("Msg", "ProtoMsg.Msg"));
            g_TypeDict.Add(msgt, t);
        }

        g_ms = new MemoryStream(64 * 1024);
    }
Exemple #15
0
        /// <summary>
        /// 注册DC到数据中心
        /// </summary>
        public static void RegisterDCHooks(eMsgTypes type, DataHook pf)
        {
            if (pf == null)
            {
                IGGDebug.Log("注册的Hook 非法");
                return;
            }


            if (g_DcHook.ContainsKey(type) == false)
            {
                g_DcHook.Add(type, pf);
            }
            else
            {
                IGGDebug.Log("不同dc有注册到相同的存储函数");
            }
        }
Exemple #16
0
        private void ProcessPacket(byte[] message, int length)
        {
            //byte[] data = new byte[length - 2];
            //Array.Copy(message, 2, data, 0, length - 2);

            //大小端转换
            ushort cmd = (ushort)message[0];

            cmd += (ushort)(message[1] << 8);

            eMsgTypes Type = (eMsgTypes)cmd;
            //IGGDebug.Log("Revice:" + Type);
            bool result = MsgM.Dispatch(Type, message, 6, length - 6);

            if (result == true)
            {
                NetConnectState.MsgArrival(cmd);
            }
        }
Exemple #17
0
    // 反序列化
    public static object Deserialize(eMsgTypes type, byte[] data, int index, int length)
    {
        if (g_TypeDict.ContainsKey(type) == false)
        {
            UnityEngine.Debug.Log("客户端不存在该proto协议类型:" + type.ToString());
            return(null);
        }
        Type t = g_TypeDict[type];

        if (null == t)
        {
            UnityEngine.Debug.Log("客户端不存在该proto协议类型:" + type.ToString());
            return(null);
        }

        g_ms.SetLength(0);
        g_ms.Write(data, index, length);
        g_ms.Seek(0, SeekOrigin.Begin);
        return(ProtoBuf.Meta.RuntimeTypeModel.Default.Deserialize(g_ms, null, t));
    }
Exemple #18
0
        /// <summary>
        /// 派发服务端事件,也可以用于模拟服务端触发事件
        /// </summary>
        /// <param name="type">proto 枚举类型</param>
        /// <param name="obj">proto协议结构</param>
        public static void DispatchEvent(eMsgTypes type, object obj)
        {
            RegisterHooksTempToRealHooks();
            if (g_DataHook.ContainsKey(type))
            {
                List <int> listHook = g_DataHook[type];
                for (int nCnt = 0; nCnt < listHook.Count; ++nCnt)
                {
                    int nHookIndex = listHook[nCnt];
#if UNITY_EDITOR
                    if (g_IndexDataHook.ContainsKey(nHookIndex))
                    {
                        g_IndexDataHook[nHookIndex](type, obj);
                    }
#else
                    try
                    {
                        if (g_IndexDataHook.ContainsKey(nHookIndex))
                        {
                            g_IndexDataHook[nHookIndex](type, obj);
                        }
                    }
                    catch (Exception e)
                    {
                        IGGDebug.Log(e.ToString());
                        //当上面s_IndexDataHook回调出现问题时,此回调就会被移除,小心成为坑
                        listHook.Remove(nHookIndex);
                        --nCnt;
                        if (listHook.Count == 0)
                        {
                            g_DataHook.Remove(type);
                            break;
                        }
                    }
#endif
                }
            }
            AntiRegisterHooksFrDelTemp();
        }
Exemple #19
0
    // 序列化
    public void  PackBuf(eMsgTypes type, byte[] msg)
    {
        ushort msgNo = (ushort)type;

        this.BufferLength = msg.Length + 8;
        // 先封包头2个字节。
        short size    = (short)BufferLength;
        short netsize = System.Net.IPAddress.HostToNetworkOrder(size);

        this.Pbuffer[0] = (byte)(netsize >> 8);
        this.Pbuffer[1] = (byte)(netsize);
        // 再封命令ID
        short id = (short)type;

        netsize         = System.Net.IPAddress.HostToNetworkOrder(id);
        this.Pbuffer[2] = (byte)(netsize >> 8);
        this.Pbuffer[3] = (byte)(netsize);
        // 再封装协议体
        Array.Copy(msg, 0, this.Pbuffer, 8, msg.Length);
        this.mIsUsed       = true;
        this.HaveSendBytes = 0;
    }
Exemple #20
0
 /// <summary>
 /// 消息处理入口
 /// </summary>
 /// <param name="cmd">消息ID</param>
 /// <param name="para">消息参数</param>
 public static bool Dispatch(eMsgTypes Type, byte[] data, int index, int length)
 {
     //处理消息
     Execute(Type, data, index, length);
     return(true);
 }
Exemple #21
0
 // 执行命令
 public static void Execute(eMsgTypes Type, byte[] data, int index, int length)
 {
     DataCenter.ProcessData(Type, data, index, length);
 }
Exemple #22
0
        }         // GetElemValFromXml

        /// <summary>
        ///
        /// </summary>
        /// <param name="i_sString"></param>
        /// <returns></returns>
        public static eMsgTypes MsgtypeFromString(string i_sString)
        {
            eMsgTypes mRet = eMsgTypes.NOP;

            switch (i_sString)
            {
            case "NOP":
                mRet = eMsgTypes.NOP;
                break;

            case "Ack":
                mRet = eMsgTypes.Ack;
                break;

            case "Ping":
                mRet = eMsgTypes.Ping;
                break;

            case "Stat":
                mRet = eMsgTypes.Stat;
                break;

            case "SBResetComp":
                mRet = eMsgTypes.SBResetComp;
                break;

            case "SBResetCompDone":
                mRet = eMsgTypes.SBResetCompDone;
                break;

            case "SBStop":
                mRet = eMsgTypes.SBStop;
                break;

            case "SBStopDone":
                mRet = eMsgTypes.SBStopDone;
                break;

            case "SBUpdate":
                mRet = eMsgTypes.SBUpdate;
                break;

            case "SBUpdateDone":
                mRet = eMsgTypes.SBUpdateDone;
                break;

            case "OSUpdate":
                mRet = eMsgTypes.OSUpdate;
                break;

            case "OSUpdateDone":
                mRet = eMsgTypes.OSUpdateDone;
                break;

            case "NetSet":
                mRet = eMsgTypes.NetSet;
                break;

            case "NetSetDone":
                mRet = eMsgTypes.NetSetDone;
                break;

            case "SrvReset":
                mRet = eMsgTypes.SrvReset;
                break;

            default:
                mRet = eMsgTypes.NOP;
                break;
            }

            return(mRet);
        } // MsgtypeFromString