public void SetFrameRoom(RoomInfo roomInfo) { var oldRoom = this.GetFrameRoom(); this.RoomInfo = roomInfo ?? new RoomInfo { Id = "0", RouteId = "" }; var oldRouteId = oldRoom.RouteId; var newRouteId = RoomInfo.RouteId; if (newRouteId.Length == 0) { NetUtil2.client.Socket?.CloseSocketTask(null, null); } if (!oldRouteId.Equals(newRouteId)) { // 重新checklogin CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Offline); this.AutoCheckLogin(); return; } if (oldRouteId.Equals(newRouteId)) { this.AutoCheckLogin(); } }
// 处理checklogin connect失败 private void HandleRelayConnectErr() { Debugger.Log("handle relay connect err"); // 重checklogin CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Offline); this.Socket.Emit("autoAuth", null); }
// 确认登录 public string CheckLogin(Action <ResponseEvent> callback, string tag) { if (this.RoomInfo == null || string.IsNullOrEmpty(this.RoomInfo.Id)) { Debugger.Log("无房间信息"); var rspWrap1 = new ClientSendServerRspWrap1 { ErrCode = ErrCode.EcSdkNoRoom, ErrMsg = "无房间信息" }; var res = new DecodeRspResult(rspWrap1, null, null); CheckLoginResponse(false, res, callback); return(""); } CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Checking); var response = new NetResponseCallback(CheckLoginResponse); const int subcmd = (int)ProtoCmd.ECmdCheckLoginReq; var para = new CheckLoginReq { Token = RequestHeader.AuthKey, RouteId = this.RoomInfo.RouteId }; var seq = this.NetUtil2.Send(para, subcmd, response, callback); CheckLoginStatus.SetRouteId(para.RouteId); Debugger.Log("CheckLogin_Para {0} {1}", para, seq); return(seq); }
private int GetReadyCode(ProtoCmd subcmd) { if (!SdkStatus.IsInited() && subcmd != ProtoCmd.ECmdLoginReq) { // 发送失败: 没有初始化 (login不需要初始化) var info = new PlayerInfo { Id = "" }; GamePlayerInfo.SetInfo(info); UserStatus.SetStatus(UserStatus.StatusType.Logout); return(ErrCode.EcSdkUninit); } // 检测 socket if (Socket == null || string.IsNullOrEmpty(Socket.Url)) { return((int)QAppProtoErrCode.EcSdkSendFail); } if (!UserStatus.IsStatus(UserStatus.StatusType.Login) && subcmd != ProtoCmd.ECmdLoginReq && subcmd != ProtoCmd.ECmdLogoutReq) { return((int)QAppProtoErrCode.EcSdkNoLogin); } if (Socket.Id == (int)ConnectionType.Relay && !CheckLoginStatus.IsChecked() && (subcmd == ProtoCmd.ECmdRelaySendFrameReq || subcmd == ProtoCmd.ECmdRelayRequestFrameReq || subcmd == ProtoCmd.ECmdHeartBeatReq || subcmd == ProtoCmd.ECmdRelayClientSendtoGamesvrReq)) { return((int)QAppProtoErrCode.EcSdkNoCheckLogin); } // 发送消息 return(0); }
// 检查是否需要 checklogin private void AutoCheckLogin() { this.Connect(); if (this.NetUtil2.client.Socket.IsSocketStatus("connect") && CheckLoginStatus.IsOffline()) { this.NetUtil2.client.Socket.Emit("autoAuth", new SocketEvent()); } }
private static void CheckLoginResponse(bool send, DecodeRspResult res, Action <ResponseEvent> callback) { CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Offline); var rspWrap1 = res.RspWrap1; var eve = new ResponseEvent(rspWrap1.ErrCode, rspWrap1.ErrMsg, rspWrap1.Seq, res.Body); if (eve.Code == ErrCode.EcOk) { CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Checked); } callback?.Invoke(eve); return; }
///////////////////////////////// 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); }
public string Send(ByteString body, int subcmd, NetResponseCallback response, Action <ResponseEvent> callback) { // 第一层 cmd:通用连接 | 帧同步连接 var requestCmd = "comm_cmd"; if (client.Socket.Id == (int)ConnectionType.Relay) { requestCmd = "relay_cmd"; } var queRequest = new QueueRequest { Body = body, Subcmd = (int)subcmd, Completed = callback, RequestCmd = requestCmd, Running = false, Response = response }; // CheckLogin 队列化 if (subcmd == (int)ClientSendServerReqWrap2Cmd.ECmdCheckLoginReq) { queRequest.BeforeRequest = () => { CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Checking); }; queRequest.AfterRequest = (seq) => { // Debugger.Log("CHECKLOGIN", seq); }; } ; // 房间操作队列化 var queue = BaseNetUtil._roomCmd.Contains((ClientSendServerReqWrap2Cmd)subcmd) ? BaseNetUtil._roomQueue : BaseNetUtil._checkLoginQueue; return(queue.Count == 0 ? SendRequest(queRequest) : PushRequest(queRequest, queue)); }
private static void ListenSocketConnect() { // 联网 Socket1.OnEvent("connect", (SocketEvent socketEvent) => { // 联网时自动Login if (!UserStatus.IsStatus(UserStatus.StatusType.Logining)) { UserUtil.Login(null); } if (string.IsNullOrEmpty(Socket1.Url)) { return; } var eve = new ResponseEvent(ErrCode.EcOk) { Data = Socket1.Id }; Sdk.Responses.OnNetwork(eve); }); Socket2.OnEvent("connect", (SocketEvent socketEvent) => { // check login 成功后发送业务数据 FrameSender.CheckLogin(null, "connect " + !!Socket2.IsSocketStatus("connect")); if (!string.IsNullOrEmpty(Socket2.Url)) { var eve = new ResponseEvent(ErrCode.EcOk) { Data = Socket2.Id }; Sdk.Responses.OnNetwork(eve); } Pinger2.Ping(null); }); // 断网 Socket1.OnEvent("connectClose", (SocketEvent socketEvent) => { // 初始化失败 SdkInitCallback(false, new ResponseEvent(ErrCode.EcSdkSocketClose)); if (!SdkStatus.IsInited()) { return; } // 断网时自动 Logout UserStatus.SetStatus(UserStatus.StatusType.Logout); if (string.IsNullOrEmpty(Socket1.Url)) { return; } var eve = new ResponseEvent(ErrCode.EcSdkSocketClose, "Socket 断开", null, null); Sdk.Responses.OnNetwork(eve); }); Socket2.OnEvent("connectClose", (SocketEvent socketEvent) => { if (!SdkStatus.IsInited()) { return; } Debugger.Log("socket2 on connect close"); CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Offline); if (!string.IsNullOrEmpty(Socket2.Url)) { var eve = new ResponseEvent(ErrCode.EcSdkSocketClose, "Socket 断开", null, null); Sdk.Responses.OnNetwork(eve); } ; Pinger2.Stop(); }); // socket 错误 Socket1.OnEvent("connectError", (SocketEvent socketEvent) => { // 初始化失败 SdkInitCallback(false, new ResponseEvent(ErrCode.EcSdkSocketError)); if (!SdkStatus.IsInited()) { return; } if (string.IsNullOrEmpty(Socket1.Url)) { return; } var eve = new ResponseEvent(ErrCode.EcSdkSocketError, "Socket 错误", null, null); Sdk.Responses.OnNetwork(eve); }); Socket2.OnEvent("connectError", (SocketEvent socketEvent) => { if (!SdkStatus.IsInited()) { return; } if (string.IsNullOrEmpty(Socket2.Url)) { return; } var eve = new ResponseEvent(ErrCode.EcSdkSocketError, "Socket 错误", null, null); Sdk.Responses.OnNetwork(eve); }); // 需要自动登录 Socket1.OnEvent("autoAuth", (SocketEvent socketEvent) => { if (!SdkStatus.IsInited()) { return; } var timer = new Timer(); timer.SetTimeout(() => { var isLogout = UserStatus.IsStatus(UserStatus.StatusType.Logout); if (!string.IsNullOrEmpty(Socket1.Url) && isLogout) { UserUtil.Login(null); } ; }, 1000); }); Socket2.OnEvent("autoAuth", (SocketEvent socketEvent) => { if (!SdkStatus.IsInited()) { return; } if (string.IsNullOrEmpty(Socket2.Url)) { return; } var timer = new Timer(); timer.SetTimeout(() => { // Debugger.Log("auto auth check 1"); // 检查是否需要重登录 if (UserStatus.IsStatus(UserStatus.StatusType.Logout)) { UserUtil.Login(null); } // 检查是否需要 checkLogin var info = FrameSender.RoomInfo ?? new RoomInfo { RouteId = "" }; // Debugger.Log("auto auth check 2: {0}", CheckLoginStatus.GetRouteId() != info.RouteId); if (CheckLoginStatus.IsOffline() || CheckLoginStatus.GetRouteId() != info.RouteId) { FrameSender.CheckLogin((ResponseEvent eve) => { if (eve.Code == ErrCode.EcOk) { Pinger2.Ping(null); } }, "autoAuth"); } }, 1000); }); }