diff --git a/Assets/TEngine/Runtime/GameFramework/Network/Interface/INetworkChannel.cs b/Assets/TEngine/Runtime/GameFramework/Network/Interface/INetworkChannel.cs index 0d337942..6a37e12a 100644 --- a/Assets/TEngine/Runtime/GameFramework/Network/Interface/INetworkChannel.cs +++ b/Assets/TEngine/Runtime/GameFramework/Network/Interface/INetworkChannel.cs @@ -120,7 +120,8 @@ namespace TEngine /// /// 网络消息包id。 /// 要注册的网络消息包处理函数。 - void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate); + /// 是否检测重复。 + void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate, bool checkRepeat = false); /// /// 移除网络消息包处理函数。 @@ -168,10 +169,10 @@ namespace TEngine /// 向远程主机发送消息包并注册消息回调。 /// /// 消息包类型。 - /// 要发送的消息包。 + /// 要发送的消息包。 /// 要注册的回调。 /// 是否需要等待UI。 /// 消息包是否发送成功。 - bool Send(T pack, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet; + bool Send(T packet, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet; } } diff --git a/Assets/TEngine/Runtime/GameFramework/Network/NetworkManager.NetworkChannelBase.cs b/Assets/TEngine/Runtime/GameFramework/Network/NetworkManager.NetworkChannelBase.cs index 1a5b7282..61aac9ca 100644 --- a/Assets/TEngine/Runtime/GameFramework/Network/NetworkManager.NetworkChannelBase.cs +++ b/Assets/TEngine/Runtime/GameFramework/Network/NetworkManager.NetworkChannelBase.cs @@ -231,28 +231,35 @@ namespace TEngine /// /// 网络消息包id。 /// 要注册的网络消息包处理函数。 - public void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate) + /// 是否检测重复。 + public void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate,bool checkRepeat = true) { if (msgDelegate == null) { throw new GameFrameworkException("Msg handler is invalid."); } - if (!_msgHandlerMap.TryGetValue(msgId, out var listHandle)) + lock (_msgHandlerMap) { - listHandle = new List(); - _msgHandlerMap[msgId] = listHandle; - } - - if (listHandle != null) - { - if (!listHandle.Contains(msgDelegate)) + if (!_msgHandlerMap.TryGetValue(msgId, out var listHandle)) { - listHandle.Add(msgDelegate); + listHandle = new List(); + _msgHandlerMap[msgId] = listHandle; } - else + + if (listHandle != null) { - Log.Error("-------------repeat RegCmdHandle MsgId:{0}-----------",msgId); + if (!listHandle.Contains(msgDelegate)) + { + listHandle.Add(msgDelegate); + } + else + { + if (checkRepeat) + { + Log.Error("-------------repeat RegCmdHandle MsgId:{0}-----------",msgId); + } + } } } } @@ -264,14 +271,17 @@ namespace TEngine /// 要注册的网络消息包处理函数。 public void RemoveMsgHandler(int msgId, CsMsgDelegate msgDelegate) { - if (!_msgHandlerMap.TryGetValue(msgId, out List listHandle)) + lock (_msgHandlerMap) { - return; - } - - if (listHandle != null) - { - listHandle.Remove(msgDelegate); + if (!_msgHandlerMap.TryGetValue(msgId, out List listHandle)) + { + return; + } + + if (listHandle != null) + { + listHandle.Remove(msgDelegate); + } } } @@ -452,14 +462,14 @@ namespace TEngine /// 向远程主机发送消息包并注册消息回调。 /// /// 消息包类型。 - /// 要发送的消息包。 + /// 要发送的消息包。 /// 要注册的回调。 /// 是否需要等待UI。 /// 消息包是否发送成功。 - public bool Send(T pack, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet + public bool Send(T packet, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet { - //TODO - return true; + RegisterMsgHandler(packet.Id,resHandler,false); + return Send(packet); } ///