示例#1
0
        private void OnRecv(GameResponse resp)
        {
            // System.Console.WriteLine("GameSocket Recv: {0}", resp.ToString());
            // Log.Debug("GameSocket Recv: {0}", resp.ToString());
            if (resp == null)
            {
                return;
            }

            bool done = false;

            if (resp.Sequence > 0)
            {
                DateTime now = DateTime.Now;
                foreach (var item in callbacks)
                {
                    if (item.Sequence == resp.Sequence)
                    {
                        //double ms= (now - item.SendTime).TotalMilliseconds;
                        // if (ms > 1000)
                        //     MessageTip.GetInstance().ShowMessage("协议: CmdId=" + resp.CmdId + ",耗时 =" + ms + "ms");
                        // Log.Debug("Response: CmdId={0}, CostTime={1}ms", resp.CmdId, (now - item.SendTime).TotalMilliseconds);
                        done = true;
                        callbacks.Remove(item);
                        item.Callback(resp.Result, resp);
                        break;
                    }
                }
            }

            if (!done)
            {
                foreach (var item in listeners)
                {
                    if (item.CmdId == resp.CmdId)
                    {
                        done = true;
                        item.Listener(resp.CmdId, resp.Result, resp);
                    }
                }
            }

            //全局报错
            if (resp.Result != 0)
            {
                System.Console.Write("Cmd:" + resp.CmdId + ",Result:" + resp.Result);
                //XEventBus.Instance.Post(EventId.GameCommonError, resp.Result);
            }

            if (!done)
            {
                System.Console.WriteLine("GameClient未处理消息:{0}", resp);
            }
        }
示例#2
0
        public void Process()
        {
            while (queues.Count > 0)
            {
                GameResponse resp = queues.Dequeue();
                OnRecv(resp);
                //Threader.RunOnMainThread(() => OnRecv(resp));
            }

            checkTimeout();
        }
示例#3
0
        private void checkTimeout()
        {
            CallbackInfo item = null;
            DateTime     now  = DateTime.Now;

            for (int i = callbacks.Count - 1; i >= 0; i--)
            {
                //超时
                item = callbacks[i];
                if (now >= item.TimeOut)
                {
                    //callbacks.Remove(item);
                    var resp = new GameResponse(item.CmdId, item.Sequence, -99);
                    //Log.Debug("GameSocket:Timeout CmdId={0},Seq={1},Result={2}", resp.CmdId, resp.Sequence, resp.Result);
                    queues.Enqueue(resp);
                    //MessageTip.GetInstance().ShowMessage("连接超时!");
                }
            }

            if (diffTime <= 0f)
            {
                diffTime = Time.time;
            }
            //超时机制
            if (callbacks.Count > 0 && Time.time - diffTime < timeout)
            {
                if (Time.time - diffTime > 0.5f)
                {
                    // LayerManager.GetInstance().ShowLoadingMask();
                }
            }
            else
            {
                diffTime = 0;
                //LayerManager.GetInstance().CloseLoadingMask();
            }
        }
示例#4
0
        //private void checkThread()
        //{
        //    while (true)
        //    {
        //        Thread.Sleep(1000);

        //        CallbackInfo item = null;
        //        DateTime now = DateTime.Now;

        //        for (int i = callbacks.Count - 1; i >= 0; i--)
        //        {
        //            //超时
        //            item = callbacks[i];
        //            if (now >= item.TimeOut)
        //            {
        //                callbacks.Remove(item);
        //                var resp = new GameResponse(item.CmdId, item.Sequence, -99);
        //                //OnRecv(resp);
        //                MessageTip.GetInstance().ShowMessage("连接超时!");
        //                Log.Debug("GameSocket:Timeout CmdId={0},Seq={1},Result={2}", resp.CmdId, resp.Sequence, resp.Result);

        //                queues.Enqueue(resp);
        //            }
        //        }
        //    }
        //}

        private void recvThread()
        {
            int max_buffer = 1024 * 64;

            byte[] buffer = new byte[max_buffer];

            bool  bReadedHead = false;
            int   iTotalLen   = 0;
            int   iRecvLen    = 0;
            bool  nextPacket  = true;
            short msgLen      = 0;

            while (!closeing)
            {
                if (!mSocket.Connected)
                {
                    break;
                }

                if (nextPacket)
                {
                    //强断有异常
                    iRecvLen = mSocket.Receive(buffer, iTotalLen, max_buffer - iTotalLen, SocketFlags.None);
                    System.Console.WriteLine("Recv len={0}", iRecvLen);
                    Debug.Log("iRecvLen:" + iRecvLen);
                    if (iRecvLen <= 0)
                    {
                        //网络断开
                        break;
                    }
                    iTotalLen += iRecvLen;
                }

                //先读包头
                if (!bReadedHead && iTotalLen > 3)
                {
                    msgLen      = (short)((buffer[1] & 0xff) << 8);
                    msgLen     += (short)(buffer[2] & 0xff);
                    bReadedHead = true;
                }
                if (bReadedHead && iTotalLen >= msgLen)
                {
                    Debug.Log("读取数据");
                    byte[] temp = new byte[msgLen - 3];
                    Array.Copy(buffer, 3, temp, 0, msgLen - 3);

                    var resp = GameResponse.Decode(temp);

                    iTotalLen -= msgLen;

                    if (iTotalLen > 0)
                    {
                        Array.Copy(buffer, msgLen, buffer, 0, iTotalLen);
                    }

                    bReadedHead = false;

                    //lock (lockObj)
                    {
                        queues.Enqueue(resp);
                    }
                    //OnRecv(resp);

                    // Log.Debug("GameSocket:Recv CmdId={0},Seq={1},Result={2}", resp.CmdId, resp.Sequence, resp.Result);

                    nextPacket = (iTotalLen == 0);
                }
                else
                {
                    nextPacket = true;
                }

                Thread.Sleep(10);
            }
        }