Update
This commit is contained in:
ALEXTANG
2023-07-13 23:54:38 +08:00
parent 1382db8c61
commit 493172a925
9 changed files with 109 additions and 36 deletions

View File

@@ -19,21 +19,6 @@ namespace TEngine.Core.Network
private static readonly Dictionary<long, Session> Sessions = new (); private static readonly Dictionary<long, Session> Sessions = new ();
public readonly Dictionary<long, FTask<IResponse>> RequestCallback = new(); public readonly Dictionary<long, FTask<IResponse>> RequestCallback = new();
#if TENGINE_UNITY
public delegate void CsMsgDelegate(IResponse msg);
public readonly Dictionary<uint, CsMsgDelegate> MsgHandles = new Dictionary<uint, CsMsgDelegate>();
public void RegisterMsgHandler(uint protocolCode,CsMsgDelegate ctx)
{
if (MsgHandles.ContainsKey(protocolCode))
{
return;
}
MsgHandles.Add(protocolCode,ctx);
}
#endif
public static void Create(ANetworkMessageScheduler networkMessageScheduler, ANetworkChannel channel) public static void Create(ANetworkMessageScheduler networkMessageScheduler, ANetworkChannel channel)
{ {
#if TENGINE_DEVELOP #if TENGINE_DEVELOP

View File

@@ -34,6 +34,28 @@ namespace TEngine.Core.Network
#endif #endif
private static readonly CoroutineLockQueueType ReceiveRouteMessageLock = new CoroutineLockQueueType("ReceiveRouteMessageLock"); private static readonly CoroutineLockQueueType ReceiveRouteMessageLock = new CoroutineLockQueueType("ReceiveRouteMessageLock");
#if TENGINE_UNITY
public readonly Dictionary<uint, List<Action<IResponse>>> MsgHandles = new Dictionary<uint, List<Action<IResponse>>>();
public void RegisterMsgHandler(uint protocolCode,Action<IResponse> ctx)
{
if (!MsgHandles.ContainsKey(protocolCode))
{
MsgHandles[protocolCode] = new List<Action<IResponse>>();
}
MsgHandles[protocolCode].Add(ctx);
}
public void UnRegisterMsgHandler(uint protocolCode,Action<IResponse> ctx)
{
if (MsgHandles.TryGetValue(protocolCode, out var handle))
{
handle.Remove(ctx);
}
}
#endif
protected override void OnLoad(int assemblyName) protected override void OnLoad(int assemblyName)
{ {
foreach (var type in AssemblyManager.ForEach(assemblyName, typeof(IMessage))) foreach (var type in AssemblyManager.ForEach(assemblyName, typeof(IMessage)))

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.IO; using System.IO;
using Codice.Client.GameUI.Explorer;
using TEngine.Core; using TEngine.Core;
#pragma warning disable CS8600 #pragma warning disable CS8600
@@ -58,9 +57,12 @@ namespace TEngine.Core.Network
#else #else
#if TENGINE_UNITY #if TENGINE_UNITY
if (session.MsgHandles.TryGetValue(packInfo.ProtocolCode,out var msgDelegate)) if (MessageDispatcherSystem.Instance.MsgHandles.TryGetValue(packInfo.ProtocolCode,out var msgDelegates))
{ {
msgDelegate.Invoke(aResponse); foreach (var msgDelegate in msgDelegates)
{
msgDelegate.Invoke(aResponse);
}
return; return;
} }
#endif #endif

View File

@@ -1,4 +1,5 @@
using System.IO; using System;
using System.IO;
using GameBase; using GameBase;
using TEngine; using TEngine;
using TEngine.Core.Network; using TEngine.Core.Network;
@@ -54,6 +55,10 @@ namespace GameLogic
public void Connect(string address, bool reconnect = false) public void Connect(string address, bool reconnect = false)
{ {
if (Status == GameClientStatus.StatusConnected || Status == GameClientStatus.StatusLogin || Status == GameClientStatus.StatusEnter)
{
return;
}
if (!reconnect) if (!reconnect)
{ {
// SetWatchReconnect(false); // SetWatchReconnect(false);
@@ -71,8 +76,11 @@ namespace GameLogic
_lastAddress = address; _lastAddress = address;
Status = reconnect ? GameClientStatus.StatusReconnect : GameClientStatus.StatusInit; Status = reconnect ? GameClientStatus.StatusReconnect : GameClientStatus.StatusInit;
Scene.CreateSession(address, ProtocolType, OnConnectComplete, OnConnectFail); if (Scene.Session == null || Scene.Session.IsDisposed)
{
Scene.CreateSession(address, ProtocolType, OnConnectComplete, OnConnectFail);
}
} }
private void OnConnectComplete() private void OnConnectComplete()
@@ -116,5 +124,15 @@ namespace GameLogic
} }
Scene.Session.Send(memoryStream,rpcId,routeTypeOpCode,routeId); Scene.Session.Send(memoryStream,rpcId,routeTypeOpCode,routeId);
} }
public void RegisterMsgHandler(uint protocolCode,Action<IResponse> ctx)
{
MessageDispatcherSystem.Instance.RegisterMsgHandler(protocolCode,ctx);
}
public void UnRegisterMsgHandler(uint protocolCode,Action<IResponse> ctx)
{
MessageDispatcherSystem.Instance.UnRegisterMsgHandler(protocolCode,ctx);
}
} }
} }

View File

@@ -0,0 +1,22 @@
using TEngine.Core.Network;
namespace GameLogic
{
public class NetworkUtils
{
public static bool CheckError(IResponse response)
{
bool hasError = false;
if (response == null)
{
var networkError = "NetWork Response Error";
hasError = true;
}
else
{
hasError = response.ErrorCode != 0;
}
return hasError;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4c373208f2ca4f28b35a28434a3b1103
timeCreated: 1689262967

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fd38f6cec6fb1864596745f8fc7067d8
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -58,12 +58,7 @@ class NetWorkDemoUI : UIWindow
Log.Info("请输入账号和密码"); Log.Info("请输入账号和密码");
return; return;
} }
PlayerNetSys.Instance.DoLoginReq(m_inputName.text,m_inputPassWord.text);
GameClient.Instance.Send(new H_C2G_LoginRequest()
{
UserName = m_inputName.text,
Password = m_inputPassWord.text
});
} }
private void OnClickRegisterBtn() private void OnClickRegisterBtn()

View File

@@ -13,17 +13,35 @@ namespace GameLogic
public override void Init() public override void Init()
{ {
base.Init(); base.Init();
GameClient.Instance.RegisterMsgHandler(OuterOpcode.H_G2C_LoginResponse,OnLoginRes);
} }
public void OnLoginRes(IResponse response)
}
public class H_C2G_LoginRequestHandler : MessageRPC<H_C2G_LoginRequest,H_G2C_LoginResponse>
{
protected override async FTask Run(Session session, H_C2G_LoginRequest request, H_G2C_LoginResponse response, Action reply)
{ {
Log.Debug($"收到请求登录的消息 request:{request.ToJson()}"); if (NetworkUtils.CheckError(response))
response.Text = "登录成功"; {
await FTask.CompletedTask; GameClient.Instance.Status = GameClientStatus.StatusConnected;
return;
}
H_G2C_LoginResponse ret = (H_G2C_LoginResponse)response;
Log.Debug(ret.ToJson());
GameClient.Instance.Status = GameClientStatus.StatusEnter;
}
public void DoLoginReq(string userName,string passWord)
{
if (GameClient.Instance.Status == GameClientStatus.StatusEnter)
{
Log.Info("当前已经登录成功。");
return;
}
H_C2G_LoginRequest loginRequest =new H_C2G_LoginRequest()
{
UserName = userName,
Password = passWord
};
GameClient.Instance.Send(loginRequest);
GameClient.Instance.Status = GameClientStatus.StatusLogin;
} }
} }
} }