| 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, | 
| } |