Пример #1
0
        // 接收响应并处理
        public void HandleMessage(byte[] body)
        {
            try {
                var rsp = Pb.DecodeRsp(body);
                var seq = rsp.RspWrap1.Seq;

                SendQueueValue val = null;
                SendQueue.TryGetValue(seq + "", out val);

                var callback = val?.response;

                if (val == null)
                {
                    return;
                }
                // 处理错误码,并拦截 value.response

                EventUpload.PushRequestEvent(new ReqEventParam {
                    RqCmd = val.Cmd, RqSq = rsp.RspWrap1.Seq, RqCd = rsp.RspWrap1.ErrCode, Time = Convert.ToInt64((DateTime.Now - val.Time).TotalMilliseconds)
                });

                // 心跳不拦截
                if (val.Cmd != (int)ProtoCmd.ECmdHeartBeatReq && HandleErrCode(rsp.RspWrap1))
                {
                    return;
                }

                callback?.Invoke(rsp);
                return;
            } catch (Exception e) {
                Debugger.Log(e.ToString());
            }
        }
Пример #2
0
        private static void LoginRsp(ResponseEvent e)
        {
            if (!SdkStatus.IsIniting())
            {
                if (e.Code == ErrCode.EcOk)
                {
                    Core.Pinger1.Ping(null);
                }
                return;
            }
            ;
            ResponseEvent eve;

            if (e.Code != ErrCode.EcOk)
            {
                eve = new ResponseEvent(e.Code);
                Core.SdkInitCallback(false, eve);
                return;
            }
            var   pingInterval   = 5000;
            var   reportInterval = 10000;
            var   enableUdp      = false;
            ulong serverTime     = 0;

            var data = (LoginRsp)e.Data;

            if (data.SdkConfig != null)
            {
                if (data.SdkConfig.PingInterval != 0)
                {
                    pingInterval = (int)data.SdkConfig.PingInterval;
                }
                if (data.SdkConfig.ReportInterval != 0)
                {
                    reportInterval = (int)data.SdkConfig.ReportInterval;
                }
                // enableUdp = data.SdkConfig.EnableUdp;
                if (data.SdkConfig.ServerTime != 0)
                {
                    serverTime = data.SdkConfig.ServerTime;
                }
            }

            // 上报
            EventUpload.Validate(GameInfo.OpenId, RequestHeader.PlayerId, reportInterval, null);
            // 心跳间隔
            Config.PingTimeout = pingInterval;
            // 是否使用udp
            Config.EnableUdp = enableUdp;

            var initRsp = new InitRsp(serverTime);

            eve = new ResponseEvent(ErrCode.EcOk, "", "", initRsp);
            Core.SdkInitCallback(true, eve);
            Core.Pinger1.Ping(null);
        }
Пример #3
0
        ///////////////////////////////// 广播 //////////////////////////////////
        // 收到帧同步消息
        private void OnRecvFrame(DecodeBstResult bstResult, string seq)
        {
            var bst = (RecvFrameBst)bstResult.Body;

            bst.Frame.RoomId = this.GetFrameRoom().Id;
            var eve = new BroadcastEvent(bst, seq);

            Debugger.Log("OnRecvFrame {0}", eve);

            // 用户数据上传
            FrameBst.Trigger();

            EventUpload.PushFrameRateEvent(Convert.ToInt64(FrameBst.deltaTime));

            this._bstCallbacks.Room.OnRecvFrame(eve);
        }
Пример #4
0
        ///////////////////////////////// PONG //////////////////////////////////
        private void HandlePong(bool send, DecodeRspResult res, DateTime startTime)
        {
            PongTimer.Stop();

            Debugger.Log("Pong {0} {1} {2}", this.Id, res.RspWrap1.Seq, send);

            if (!send)
            {
                this.HandlePongTimeout(res.RspWrap1.Seq);
                return;
            }

            this.Retry = MaxPingRetry;
            // 清空发送队列
            this.client.ClearQueue();

            // 心跳的错误码单独处理
            var errCode = res.RspWrap1.ErrCode;

            // 上报心跳时延
            if (this.Id == 1 && errCode == ErrCode.EcOk)
            {
                EventUpload.PushPingEvent(new PingEventParam(Convert.ToInt64((DateTime.Now - startTime).TotalMilliseconds)));
            }

            if (IsTokenError(errCode))
            {
                UserStatus.SetStatus(UserStatus.StatusType.Logout);
                this.client.Socket.Emit("autoAuth", new SocketEvent());
                return;
            }

            if (IsRelayConnectError(errCode) && this.client.Socket.Id == (int)ConnectionType.Relay)
            {
                CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Offline);
                this.client.Socket.Emit("autoAuth", new SocketEvent());
                return;
            }

            this.PingTimer.SetTimer(() => this.Ping(null), this.Timeout);
        }
Пример #5
0
        ///////////////////////////////// 广播 //////////////////////////////////
        // 收到帧同步消息
        private void OnRecvFrame(DecodeBstResult bstResult, string seq)
        {
            var bst = new RecvFrameBst();

            bst.MergeFrom(bstResult.Body);
            bst.Frame.RoomId = this.GetFrameRoom().Id;
            var eve = new BroadcastEvent(bst, seq);

            // 用户数据上传
            FrameBst.Trigger();

            EventUpload.PushFrameRateEvent(Convert.ToInt64(FrameBst.deltaTime));

            // 上报时间间隔
            foreach (var frameItem in bst.Frame.Items)
            {
                if (frameItem.PlayerId == RequestHeader.PlayerId)
                {
                    EventUpload.PushSendRecvEvent(SdkUtil.GetCurrentTimeMilliseconds() - Convert.ToInt64(frameItem.Timestamp));
                }
            }
            this._responses.OnRecvFrame(eve);
        }