using UnityEngine; 
 | 
using System; 
 | 
using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
  
 | 
  
 | 
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 ClientSocket mainSocket; 
 | 
    public bool mainSocketConnected { get { return mainSocket == null ? false : mainSocket.connected; } } 
 | 
  
 | 
    public float timeSinceMainSocketLastProtocol 
 | 
    { 
 | 
        get { return mainSocket == null ? Time.time : (float)(DateTime.Now - mainSocket.lastPackageTime).TotalSeconds; } 
 | 
    } 
 | 
  
 | 
  
 | 
    Queue<GameNetPackBasic> mainProtocolQueue = new Queue<GameNetPackBasic>(); 
 | 
  
 | 
  
 | 
    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<bool> onConnected) 
 | 
    { 
 | 
        try 
 | 
        { 
 | 
            if (mainSocketConnected) 
 | 
            { 
 | 
                mainSocket.CloseConnect(); 
 | 
            } 
 | 
        } 
 | 
        catch (System.Exception ex) 
 | 
        { 
 | 
            Debug.Log(ex); 
 | 
        } 
 | 
  
 | 
        mainSocket = new ClientSocket(ServerType.Main); 
 | 
        mainProtocolQueue.Clear(); 
 | 
  
 | 
        mainSocket.Connect(ip, port, (bool ok) => 
 | 
        { 
 | 
            if (onConnected != null) 
 | 
            { 
 | 
                onConnected(ok); 
 | 
            } 
 | 
        }); 
 | 
    } 
 | 
  
 | 
    public void SendInfo(GameNetPackBasic protocol) 
 | 
    { 
 | 
        if (mainSocket != null) 
 | 
        { 
 | 
            mainSocket.SendInfo(protocol); 
 | 
            DebugPkgCache.Push(protocol); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void SendInfo(byte[] vBytes) 
 | 
    { 
 | 
        if (mainSocket != null) 
 | 
        { 
 | 
            mainSocket.SendInfo(vBytes); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    public void PushPackage(GameNetPackBasic protocol, ServerType type) 
 | 
    { 
 | 
        lock (this) 
 | 
        { 
 | 
            if (protocol == null) 
 | 
            { 
 | 
                return; 
 | 
            } 
 | 
  
 | 
            if (PackageRegedit.Contain(protocol.cmd)) 
 | 
            { 
 | 
                mainProtocolQueue.Enqueue(protocol); 
 | 
  
 | 
                DebugPkgCache.Push(protocol); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                Debug.LogErrorFormat("数据包(cmd:{0})未登记!", protocol.cmd); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void Disconnect() 
 | 
    { 
 | 
        try 
 | 
        { 
 | 
            if (mainSocket != null) 
 | 
            { 
 | 
                mainSocket.CloseConnect(); 
 | 
            } 
 | 
  
 | 
            mainProtocolQueue.Clear(); 
 | 
        } 
 | 
        catch (Exception ex) 
 | 
        { 
 | 
            Debug.Log(ex); 
 | 
        } 
 | 
        finally 
 | 
        { 
 | 
            netState = NetState.DisConnected; 
 | 
            LoginManager.Instance.busy = false; 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public void Reconnect() 
 | 
    { 
 | 
        try 
 | 
        { 
 | 
            if (mainSocket != null) 
 | 
            { 
 | 
                mainSocket.CloseConnect(); 
 | 
            } 
 | 
  
 | 
            mainProtocolQueue.Clear(); 
 | 
        } 
 | 
        catch (Exception ex) 
 | 
        { 
 | 
            Debug.Log(ex); 
 | 
        } 
 | 
        finally 
 | 
        { 
 | 
            netState = NetState.AccountLogin; 
 | 
            LoginManager.Instance.busy = false; 
 | 
            LoginManager.Instance.ReAccountLogin(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void LoginOut() 
 | 
    { 
 | 
        try 
 | 
        { 
 | 
            SDKUtils.Instance.RoleLoginOut(); 
 | 
  
 | 
            if (mainSocket != null) 
 | 
            { 
 | 
                mainSocket.CloseConnect(); 
 | 
            } 
 | 
  
 | 
            mainProtocolQueue.Clear(); 
 | 
        } 
 | 
        catch (Exception ex) 
 | 
        { 
 | 
            Debug.Log(ex); 
 | 
        } 
 | 
        finally 
 | 
        { 
 | 
            netState = NetState.NerverConnect; 
 | 
  
 | 
            LoginManager.Instance.busy = false; 
 | 
  
 | 
            StageManager.Instance.ReturnToLoginScene(); 
 | 
            NetLinkWin.Hide(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void OnAccountLogin() 
 | 
    { 
 | 
        netState = NetState.AccountLogin; 
 | 
    } 
 | 
  
 | 
    public void OnEnterWorld() 
 | 
    { 
 | 
        netState = NetState.RoleLogin; 
 | 
    } 
 | 
  
 | 
    void OnUpdate() 
 | 
    { 
 | 
        lock (this) 
 | 
        { 
 | 
            while (mainProtocolQueue.Count > 0) 
 | 
            { 
 | 
                var package = mainProtocolQueue.Dequeue(); 
 | 
                if (package != null) 
 | 
                { 
 | 
                    PackageRegedit.Distribute(package); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    public enum NetState 
 | 
    { 
 | 
        NerverConnect = 1, 
 | 
        AccountLogin = 2, 
 | 
        // CreateOrSelectRole = 3, 
 | 
        RoleLogin = 4, 
 | 
        Connected = 5, 
 | 
        DisConnected = 6, 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 | 
  
 | 
public enum ServerType 
 | 
{ 
 | 
    Main = 1, 
 | 
    B430 = 2, 
 | 
} 
 |