Exemple #1
0
        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();
            }
        }
Exemple #2
0
 // 处理checklogin connect失败
 private void HandleRelayConnectErr()
 {
     Debugger.Log("handle relay connect err");
     // 重checklogin
     CheckLoginStatus.SetStatus(CheckLoginStatus.StatusType.Offline);
     this.Socket.Emit("autoAuth", null);
 }
Exemple #3
0
        // 确认登录
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
 // 检查是否需要 checklogin
 private void AutoCheckLogin()
 {
     this.Connect();
     if (this.NetUtil2.client.Socket.IsSocketStatus("connect") && CheckLoginStatus.IsOffline())
     {
         this.NetUtil2.client.Socket.Emit("autoAuth", new SocketEvent());
     }
 }
Exemple #6
0
        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;
        }
Exemple #7
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);
        }
Exemple #8
0
        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));
        }
Exemple #9
0
        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);
            });
        }