Exemple #1
0
        private void DoReceiveInMain()
        {
            recvBuffQueue.Switch();
            while (!recvBuffQueue.Empty())
            {
                var recvBufferRaw = recvBuffQueue.Pop();
                int ret           = kcp.Input(recvBufferRaw, recvBufferRaw.Length);

                if (ret < 0)
                {
                    Debuger.LogError("收到不正确的KCP包, Ret:{0}", ret);
                    return;
                }

                needKcpUpdateFlag = true;
                for (int size = kcp.PeekSize(); size > 0; size = kcp.PeekSize())
                {
                    var recvBuffer = new byte[size];
                    if (kcp.Recv(recvBuffer) > 0)
                    {
                        lastRecvTimestamp = (uint)TimeUtility.GetTotalMillisecondsSince1970();
                        var data = ProtoBuffUtility.Deserialize <FSPDataSToC>(recvBuffer);
                        recvListener?.Invoke(data.frame);
                    }
                }
            }
        }
        private void DoReceiveInMain()
        {
            recvBufQueue.Switch();
            while (!recvBufQueue.Empty())
            {
                var recvBufferRaw = recvBufQueue.Pop();
                int ret           = kcp.Input(recvBufferRaw, recvBufferRaw.Length);
                if (ret < 0)
                {
                    Debuger.LogError("收到不正确的KCP包!Ret:{0}", ret);
                    return;
                }

                needKcpUpdateFlag = true;

                for (int size = kcp.PeekSize(); size > 0; size = kcp.PeekSize())
                {
                    var recvBuffer = new byte[size];
                    if (kcp.Recv(recvBuffer) > 0)
                    {
                        if (listener != null)
                        {
                            FSPDataCToS data = ProtoBuffUtility.Deserialize <FSPDataCToS>(recvBuffer);
                            listener(data);
                        }
                        else
                        {
                            Debuger.LogError("找不到接收者!");
                        }
                    }
                }
            }
        }
        public void OnReceive(ISession session, byte[] bytes, int len)
        {
            NetMessage msg = new NetMessage();

            msg.Deserialize(bytes, len);
            if (session.IsAuth())
            {
                if (msg.Head.cmd == 0) //RPC
                {
                    RPCMessage rpcMessage = ProtoBuffUtility.Deserialize <RPCMessage>(msg.content);
                    HandleRPCMessage(session, rpcMessage);
                }
                else //Proto
                {
                    HandlePrptoMessage(session, msg);
                }
            }
            else
            {
                if (msg.Head.cmd == authCmd)
                {
                    HandlePrptoMessage(session, msg);
                }
                else
                {
                    Debuger.LogWarning("收到未授权的消息! cmd:{0}", msg.Head.cmd);
                }
            }
        }
        //--------------------------------------------------------------------------


        //--------------------------------------------------------------------------

        private void HandlePrptoMessage(NetMessage message)
        {
            if (message.Head.index == 0) //监听命令
            {
                if (ntfHelpers.ContainsKey(message.Head.cmd))
                {
                    var helper = ntfHelpers[message.Head.cmd];
                    if (helper != null)
                    {
                        object obj = ProtoBuffUtility.Deserialize(helper.typeMsg, message.content);
                        if (obj != null)
                        {
                            helper.successHandle.DynamicInvoke(obj);
                        }
                        else
                        {
                            Debuger.LogError("反序列化失败! cmd:{0}", message.Head.cmd);
                        }
                    }
                    else
                    {
                        Debuger.LogError("未找到对应的监听者! cmd:{0}", message.Head.cmd);
                    }
                }
                else
                {
                    Debuger.LogError("未找到对应的监听者! cmd:{0}", message.Head.cmd);
                }
            }
            else //一问一答
            {
                if (rspHelpers.ContainsKey(message.Head.index))
                {
                    var helper = rspHelpers[message.Head.index];
                    if (helper != null)
                    {
                        rspHelpers.Remove(message.Head.index);
                        object obj = ProtoBuffUtility.Deserialize(helper.typeMsg, message.content);
                        if (obj != null)
                        {
                            helper.successHandle.DynamicInvoke(obj);
                        }
                        else
                        {
                            Debuger.LogError("反序列化失败! cmd:{0}", message.Head.cmd);
                        }
                    }
                    else
                    {
                        Debuger.LogError("未找到对应的监听者! cmd:{0}", message.Head.cmd);
                    }
                }
                else
                {
                    Debuger.LogError("未找到对应的监听者! cmd:{0}", message.Head.cmd);
                }
            }
        }
        private void DoReceiveInMain()
        {
            lock (recvBufferQueue)
            {
                if (recvBufferQueue.Count > 0)
                {
                    byte[] buffer = recvBufferQueue.Dequeue();

                    IPCMessage msg = ProtoBuffUtility.Deserialize<IPCMessage>(buffer);
                    HandleMessage(msg);
                }
            }
        }
        private void OnReceive(byte[] bytes, int len)
        {
            NetMessage msg = new NetMessage();

            msg.Deserialize(bytes, len);
            if (msg.Head.cmd == 0)
            {
                RPCMessage rpcmsg = ProtoBuffUtility.Deserialize <RPCMessage>(msg.content);
                HandleRPCMessage(rpcmsg);
            }
            else
            {
                HandlePrptoMessage(msg);
            }
        }
        private void HandleRPCMessage(ISession session, RPCMessage rpcMessage)
        {
            RPCMethodHelper helper = rpcManager.GetMethodHelper(rpcMessage.name);

            if (helper != null)
            {
                object[] args      = new object[rpcMessage.rawargs.Count + 1];
                var      rawargs   = rpcMessage.rawargs;
                var      paramInfo = helper.method.GetParameters();
                args[0] = session;
                if (args.Length == paramInfo.Length)
                {
                    for (int i = 0; i < rawargs.Count; i++)
                    {
                        if (rawargs[i].type == enRPCArgType.PBObject)
                        {
                            args[i + 1] = ProtoBuffUtility.Deserialize(paramInfo[i + 1].ParameterType, rawargs[i].rawValue);
                        }
                        else
                        {
                            args[i + 1] = rawargs[i].value;
                        }
                    }

                    currInvokingName    = rpcMessage.name;
                    currInvokingSession = session;

                    try
                    {
                        helper.method.Invoke(helper.listener, BindingFlags.NonPublic, null, args, null);
                    }
                    catch (Exception e)
                    {
                        Debuger.LogError("RPC调用出错:{0} : {1}\n{2}", rpcMessage.name, e.Message, e.StackTrace);
                    }
                    currInvokingName    = null;
                    currInvokingSession = null;
                }
                else
                {
                    Debuger.LogWarning("参数数量不一致!{0}", rpcMessage.name);
                }
            }
            else
            {
                Debuger.LogWarning("RPC不存在!{0}", rpcMessage.name);
            }
        }
 private void HandleMessage(IPCMessage msg)
 {
     RPCMessage rpcmsg = msg.rpcMessage;
     var helper = rpcManager.GetMethodHelper(rpcmsg.name);
     if (helper != null)
     {
         object[] args  = new object[rpcmsg.args.Length +1];
         List<RPCArg> rawargs = rpcmsg.rawargs;
         ParameterInfo[] paramInfo = helper.method.GetParameters();
         if (args.Length == paramInfo.Length)
         {
             for (int i = 0; i < rawargs.Count; i++)
             {
                 if (rawargs[i].type == enRPCArgType.PBObject)
                 {
                     args[i + 1] = ProtoBuffUtility.Deserialize(paramInfo[i + 1].ParameterType, rawargs[i].rawValue);
                 }
                 else
                 {
                     args[i + 1] = rawargs[i].value;
                 }
             }
             args[0] = msg.srcID;
             currInvokingName = rpcmsg.name;
             currInvokingSrc = msg.srcID;
             try
             {
                 helper.method.Invoke(helper.listener, BindingFlags.NonPublic, null, args, null);
             }
             catch (Exception e)
             {
                 Debuger.LogError("RPC调用出错:{0}\n{1}", e.Message, e.StackTrace);
             }
             currInvokingName = "";
             currInvokingSrc = 0;
         }
         else
         {
             Debuger.LogWarning("参数数量不一致!");
         }
     }
     else
     {
         Debuger.LogWarning("RPC不存在!");
     }
 }
        private void HandleRPCMessage(RPCMessage rpcmsg)
        {
            Debuger.Log("Connection[{0}]-> {1}({2})", connection.ID, rpcmsg.name, rpcmsg.args);
            var helper = rpcManager.GetMethodHelper(rpcmsg.name);

            if (helper != null)
            {
                object[] args      = rpcmsg.args;
                var      rawargs   = rpcmsg.rawargs;
                var      paramInfo = helper.method.GetParameters();

                if (rawargs.Count == paramInfo.Length)
                {
                    for (int i = 0; i < rawargs.Count; i++)
                    {
                        if (rawargs[i].type == enRPCArgType.PBObject)
                        {
                            var    type = paramInfo[i].ParameterType;
                            object arg  = ProtoBuffUtility.Deserialize(type, rawargs[i].rawValue);
                            args[i] = arg;
                        }
                    }
                    currInvokingName = rpcmsg.name;
                    try
                    {
                        helper.method.Invoke(helper.listener, BindingFlags.NonPublic, null, args, null);
                    }
                    catch (Exception e)
                    {
                        Debuger.LogError("RPC调用出错:{0}: {1}\n{2}", rpcmsg.name, e.Message, e.StackTrace);
                    }
                    currInvokingName = null;
                }
                else
                {
                    Debuger.LogWarning("参数数量不一致!{0}", rpcmsg.name);
                }
            }
            else
            {
                Debuger.LogWarning("RPC不存在!{0} ", rpcmsg.name);
            }
        }
        //----------------------------------------------------------------------------



        //----------------------------------------------------------------------------

        private void HandlePrptoMessage(ISession session, NetMessage msg)
        {
            if (listenerHelpers.ContainsKey(msg.Head.cmd))
            {
                var helper = listenerHelpers[msg.Head.cmd];
                if (helper != null)
                {
                    object obj = ProtoBuffUtility.Deserialize(helper.typeMsg, msg.content);
                    if (obj != null)
                    {
                        helper.handleMsg.DynamicInvoke(session, msg.Head.index, obj);
                    }
                }
                else
                {
                    Debuger.LogWarning("未找到对应的监听者! cmd:{0}", msg.Head.cmd);
                }
            }
            else
            {
                Debuger.LogWarning("未找到对应的监听者! cmd:{0}", msg.Head.cmd);
            }
        }