// 接收响应并处理 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()); } }
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); }
///////////////////////////////// 广播 ////////////////////////////////// // 收到帧同步消息 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); }
///////////////////////////////// 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); }
///////////////////////////////// 广播 ////////////////////////////////// // 收到帧同步消息 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); }