using System; using System.IO; using GameBase; using TEngine; using TEngine.Core.Network; namespace GameLogic { /// /// 网络客户端状态。 /// public enum GameClientStatus { /// /// 初始化。 /// StatusInit, /// /// 连接成功服务器。 /// StatusConnected, /// /// 重新连接。 /// StatusReconnect, /// /// 断开连接。 /// StatusClose, /// /// 登录中。 /// StatusLogin, /// /// AccountLogin成功,进入服务器了。 /// StatusEnter, } /// /// 网络客户端。 /// public class GameClient:Singleton { public readonly NetworkProtocolType ProtocolType = NetworkProtocolType.KCP; public GameClientStatus Status { get; set; } = GameClientStatus.StatusInit; public Scene Scene { private set; get; } private string _lastAddress = String.Empty; public GameClient() { Scene = GameApp.Instance.Scene; } public void Connect(string address, bool reconnect = false) { if (Status == GameClientStatus.StatusConnected || Status == GameClientStatus.StatusLogin || Status == GameClientStatus.StatusEnter) { return; } if (!reconnect) { // SetWatchReconnect(false); } if (reconnect) { // GameEvent.Get().ShowWaitUITip(WaitUISeq.LOGINWORLD_SEQID, G.R(TextDefine.ID_TIPS_RECONNECTING)); } else { // GameEvent.Get().ShowWaitUI(WaitUISeq.LOGINWORLD_SEQID); } _lastAddress = address; Status = reconnect ? GameClientStatus.StatusReconnect : GameClientStatus.StatusInit; if (Scene.Session == null || Scene.Session.IsDisposed) { Scene.CreateSession(address, ProtocolType, OnConnectComplete, OnConnectFail, OnConnectDisconnect); } } private void OnConnectComplete() { Status = GameClientStatus.StatusConnected; Log.Info("Connect to server success"); } private void OnConnectFail() { Status = GameClientStatus.StatusClose; Log.Warning("Could not connect to server"); } private void OnConnectDisconnect() { Status = GameClientStatus.StatusClose; Log.Warning("OnConnectDisconnect server"); } public virtual void Send(object message, uint rpcId = 0, long routeId = 0) { if (Scene.Session == null) { Log.Error("Send Message Failed Because Session Is Null"); return; } Scene.Session.Send(message,rpcId,routeId); } public virtual void Send(IRouteMessage routeMessage, uint rpcId = 0, long routeId = 0) { if (Scene.Session == null) { Log.Error("Send Message Failed Because Session Is Null"); return; } Scene.Session.Send(routeMessage,rpcId,routeId); } public virtual void Send(MemoryStream memoryStream, uint rpcId = 0, long routeTypeOpCode = 0, long routeId = 0) { if (Scene.Session == null) { Log.Error("Send Message Failed Because Session Is Null"); return; } Scene.Session.Send(memoryStream,rpcId,routeTypeOpCode,routeId); } public virtual async FTask Call(IRequest request, long routeId = 0) { if (Scene == null || Scene.Session == null) { return null; } var requestCallback = await Scene.Session.Call(request,routeId); return requestCallback; } public void RegisterMsgHandler(uint protocolCode,Action ctx) { MessageDispatcherSystem.Instance.RegisterMsgHandler(protocolCode,ctx); } public void UnRegisterMsgHandler(uint protocolCode,Action ctx) { MessageDispatcherSystem.Instance.UnRegisterMsgHandler(protocolCode,ctx); } } }