少年修仙传客户端代码仓库
client_Wu Xijin
2018-08-20 ddcba938b4b7cb150170a07d59b480d0748a476c
Core/NetworkPackage/GameNetSystem.cs
@@ -1,291 +1,291 @@
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using Snxxz.UI;
public class GameNetSystem : Singleton<GameNetSystem>
{
    NetUpdateBehaviour m_NetUpdateBehaviour;
    NeverConnectState neverConnectState;
    AccountLoginState accountLoginState;
    CreateOrSelectRoleState createOrSelectRoleState;
    RoleLoginState roleLoginState;
    ConnectedState connectedState;
    DisconnectState disconnectState;
    NetState m_NetState;
    public NetState netState {
        get { return this.m_NetState; }
        set {
            if (this.m_NetState != value)
            {
                switch (m_NetState)
                {
                    case NetState.NerverConnect:
                        neverConnectState.OnExit();
                        break;
                    case NetState.AccountLogin:
                        accountLoginState.OnExit();
                        break;
                    case NetState.CreateOrSelectRole:
                        createOrSelectRoleState.OnExit();
                        break;
                    case NetState.RoleLogin:
                        roleLoginState.OnExit();
                        break;
                    case NetState.Connected:
                        connectedState.OnExit();
                        break;
                    case NetState.DisConnected:
                        disconnectState.OnExit();
                        break;
                }
                this.m_NetState = value;
                switch (m_NetState)
                {
                    case NetState.NerverConnect:
                        neverConnectState.OnEnter();
                        break;
                    case NetState.AccountLogin:
                        accountLoginState.OnEnter();
                        break;
                    case NetState.CreateOrSelectRole:
                        createOrSelectRoleState.OnEnter();
                        break;
                    case NetState.RoleLogin:
                        roleLoginState.OnEnter();
                        break;
                    case NetState.Connected:
                        connectedState.OnEnter();
                        break;
                    case NetState.DisConnected:
                        disconnectState.OnEnter();
                        break;
                }
            }
        }
    }
    private ClientSocketController socketController;
    public bool socketConnected { get { return socketController == null ? false : socketController.Connected; } }
    Queue<GameNetPackBasic> packQueue = new Queue<GameNetPackBasic>();
    DateTime m_LastPackageTime;
    public DateTime lastPackageTime { get { return m_LastPackageTime; } }
    Action onConnected;
    public event Action disconnectEvent;
    public event Action connectedEvent;
    public GameNetSystem()
    {
        var gameObject = new GameObject("NetUpdateBehaviour");
        GameObject.DontDestroyOnLoad(gameObject);
        m_NetUpdateBehaviour = gameObject.AddComponent<NetUpdateBehaviour>();
        m_NetUpdateBehaviour.RegisterUpdateCallBack(OnUpdate);
        neverConnectState = gameObject.AddComponent<NeverConnectState>();
        accountLoginState = gameObject.AddComponent<AccountLoginState>();
        createOrSelectRoleState = gameObject.AddComponent<CreateOrSelectRoleState>();
        roleLoginState = gameObject.AddComponent<RoleLoginState>();
        connectedState = gameObject.AddComponent<ConnectedState>();
        disconnectState = gameObject.AddComponent<DisconnectState>();
        netState = NetState.NerverConnect;
    }
    public void BeginConnectGameServer(string _ip, int _port, Action _onConnected)
    {
        if (socketController != null && socketController.Connected)
        {
            socketController.CloseConnect();
        }
        socketController = new ClientSocketController();
        GameNetEncode.ResetEncodeIndex();
        lock (packQueue)
        {
            packQueue.Clear();
        }
        onConnected = _onConnected;
        socketController.Connect(_ip, _port, OnSocketConnected);
    }
    public void SendInfo(GameNetPackBasic vNetPack)
    {
        if (socketController != null)
        {
            socketController.SendInfo(vNetPack);
        }
    }
    public void SendInfo(byte[] vBytes)
    {
        if (socketController != null)
        {
            socketController.SendInfo(vBytes);
        }
    }
    public void PushPackage(GameNetPackBasic _package)
    {
        if (_package == null)
        {
            return;
        }
        m_LastPackageTime = DateTime.Now;
        lock (packQueue)
        {
            lock (_package)
            {
                if (PackageRegedit.Contain(_package.cmd))
                {
                    packQueue.Enqueue(_package);
                }
                else
                {
                    DesignDebug.LogWarningFormat("数据包(cmd:{0})未登记!", _package.cmd);
                }
            }
        }
    }
    public void Disconnect()
    {
        try
        {
            if (socketController != null)
            {
                socketController.CloseConnect();
            }
            GameNetEncode.ResetEncodeIndex();
            lock (packQueue)
            {
                packQueue.Clear();
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
        finally
        {
            netState = NetState.DisConnected;
        }
    }
    public void Reconnect()
    {
        try
        {
            if (socketController != null)
            {
                socketController.CloseConnect();
            }
            GameNetEncode.ResetEncodeIndex();
            lock (packQueue)
            {
                packQueue.Clear();
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
        finally
        {
            netState = NetState.AccountLogin;
            var loginModel = ModelCenter.Instance.GetModel<LoginModel>();
            loginModel.busy = false;
            loginModel.ReAccountLogin();
        }
    }
    public void LoginOut()
    {
        try
        {
            if (socketController != null)
            {
                socketController.CloseConnect();
            }
            GameNetEncode.ResetEncodeIndex();
            lock (packQueue)
            {
                packQueue.Clear();
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
        finally
        {
            netState = NetState.NerverConnect;
            var loginModel = ModelCenter.Instance.GetModel<LoginModel>();
            loginModel.busy = false;
            WindowJumpMgr.Instance.ClearJumpData();
            StageManager.Instance.LoadLoginStage();
            NetLinkWin.Hide();
        }
    }
    public void OnAccountLogin()
    {
        netState = NetState.AccountLogin;
    }
    public void OnEnterWorld()
    {
        netState = NetState.RoleLogin;
    }
    void OnUpdate()
    {
        lock (packQueue)
        {
            if (packQueue != null)
            {
                while (packQueue.Count > 0)
                {
                    PackageRegedit.Distribute(packQueue.Dequeue());
                }
            }
        }
    }
    private void OnSocketConnected()
    {
        m_LastPackageTime = DateTime.Now;
        if (onConnected != null)
        {
            onConnected();
            onConnected = null;
        }
    }
    public enum NetState
    {
        NerverConnect = 1,
        AccountLogin = 2,
        CreateOrSelectRole = 3,
        RoleLogin = 4,
        Connected = 5,
        DisConnected = 6,
    }
}
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using Snxxz.UI;
public class GameNetSystem : Singleton<GameNetSystem>
{
    NetUpdateBehaviour m_NetUpdateBehaviour;
    NeverConnectState neverConnectState;
    AccountLoginState accountLoginState;
    CreateOrSelectRoleState createOrSelectRoleState;
    RoleLoginState roleLoginState;
    ConnectedState connectedState;
    DisconnectState disconnectState;
    NetState m_NetState;
    public NetState netState {
        get { return this.m_NetState; }
        set {
            if (this.m_NetState != value)
            {
                switch (m_NetState)
                {
                    case NetState.NerverConnect:
                        neverConnectState.OnExit();
                        break;
                    case NetState.AccountLogin:
                        accountLoginState.OnExit();
                        break;
                    case NetState.CreateOrSelectRole:
                        createOrSelectRoleState.OnExit();
                        break;
                    case NetState.RoleLogin:
                        roleLoginState.OnExit();
                        break;
                    case NetState.Connected:
                        connectedState.OnExit();
                        break;
                    case NetState.DisConnected:
                        disconnectState.OnExit();
                        break;
                }
                this.m_NetState = value;
                switch (m_NetState)
                {
                    case NetState.NerverConnect:
                        neverConnectState.OnEnter();
                        break;
                    case NetState.AccountLogin:
                        accountLoginState.OnEnter();
                        break;
                    case NetState.CreateOrSelectRole:
                        createOrSelectRoleState.OnEnter();
                        break;
                    case NetState.RoleLogin:
                        roleLoginState.OnEnter();
                        break;
                    case NetState.Connected:
                        connectedState.OnEnter();
                        break;
                    case NetState.DisConnected:
                        disconnectState.OnEnter();
                        break;
                }
            }
        }
    }
    private ClientSocketController socketController;
    public bool socketConnected { get { return socketController == null ? false : socketController.Connected; } }
    Queue<GameNetPackBasic> packQueue = new Queue<GameNetPackBasic>();
    DateTime m_LastPackageTime;
    public DateTime lastPackageTime { get { return m_LastPackageTime; } }
    Action onConnected;
    public event Action disconnectEvent;
    public event Action connectedEvent;
    public GameNetSystem()
    {
        var gameObject = new GameObject("NetUpdateBehaviour");
        GameObject.DontDestroyOnLoad(gameObject);
        m_NetUpdateBehaviour = gameObject.AddComponent<NetUpdateBehaviour>();
        m_NetUpdateBehaviour.RegisterUpdateCallBack(OnUpdate);
        neverConnectState = gameObject.AddComponent<NeverConnectState>();
        accountLoginState = gameObject.AddComponent<AccountLoginState>();
        createOrSelectRoleState = gameObject.AddComponent<CreateOrSelectRoleState>();
        roleLoginState = gameObject.AddComponent<RoleLoginState>();
        connectedState = gameObject.AddComponent<ConnectedState>();
        disconnectState = gameObject.AddComponent<DisconnectState>();
        netState = NetState.NerverConnect;
    }
    public void BeginConnectGameServer(string _ip, int _port, Action _onConnected)
    {
        if (socketController != null && socketController.Connected)
        {
            socketController.CloseConnect();
        }
        socketController = new ClientSocketController();
        GameNetEncode.ResetEncodeIndex();
        lock (packQueue)
        {
            packQueue.Clear();
        }
        onConnected = _onConnected;
        socketController.Connect(_ip, _port, OnSocketConnected);
    }
    public void SendInfo(GameNetPackBasic vNetPack)
    {
        if (socketController != null)
        {
            socketController.SendInfo(vNetPack);
        }
    }
    public void SendInfo(byte[] vBytes)
    {
        if (socketController != null)
        {
            socketController.SendInfo(vBytes);
        }
    }
    public void PushPackage(GameNetPackBasic _package)
    {
        if (_package == null)
        {
            return;
        }
        m_LastPackageTime = DateTime.Now;
        lock (packQueue)
        {
            lock (_package)
            {
                if (PackageRegedit.Contain(_package.cmd))
                {
                    packQueue.Enqueue(_package);
                }
                else
                {
                    DebugEx.LogWarningFormat("数据包(cmd:{0})未登记!", _package.cmd);
                }
            }
        }
    }
    public void Disconnect()
    {
        try
        {
            if (socketController != null)
            {
                socketController.CloseConnect();
            }
            GameNetEncode.ResetEncodeIndex();
            lock (packQueue)
            {
                packQueue.Clear();
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
        finally
        {
            netState = NetState.DisConnected;
        }
    }
    public void Reconnect()
    {
        try
        {
            if (socketController != null)
            {
                socketController.CloseConnect();
            }
            GameNetEncode.ResetEncodeIndex();
            lock (packQueue)
            {
                packQueue.Clear();
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
        finally
        {
            netState = NetState.AccountLogin;
            var loginModel = ModelCenter.Instance.GetModel<LoginModel>();
            loginModel.busy = false;
            loginModel.ReAccountLogin();
        }
    }
    public void LoginOut()
    {
        try
        {
            if (socketController != null)
            {
                socketController.CloseConnect();
            }
            GameNetEncode.ResetEncodeIndex();
            lock (packQueue)
            {
                packQueue.Clear();
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
        finally
        {
            netState = NetState.NerverConnect;
            var loginModel = ModelCenter.Instance.GetModel<LoginModel>();
            loginModel.busy = false;
            WindowJumpMgr.Instance.ClearJumpData();
            StageManager.Instance.LoadLoginStage();
            NetLinkWin.Hide();
        }
    }
    public void OnAccountLogin()
    {
        netState = NetState.AccountLogin;
    }
    public void OnEnterWorld()
    {
        netState = NetState.RoleLogin;
    }
    void OnUpdate()
    {
        lock (packQueue)
        {
            if (packQueue != null)
            {
                while (packQueue.Count > 0)
                {
                    PackageRegedit.Distribute(packQueue.Dequeue());
                }
            }
        }
    }
    private void OnSocketConnected()
    {
        m_LastPackageTime = DateTime.Now;
        if (onConnected != null)
        {
            onConnected();
            onConnected = null;
        }
    }
    public enum NetState
    {
        NerverConnect = 1,
        AccountLogin = 2,
        CreateOrSelectRole = 3,
        RoleLogin = 4,
        Connected = 5,
        DisConnected = 6,
    }
}