public override async void SendMessageAsync(INetworkMessage netMsg)
        {
            IRemotePeer tmpPeer;

            if (peerDict.TryGetValue(netMsg.Conv, out tmpPeer))
            {
                UdpClientPeer peer      = tmpPeer as UdpClientPeer;
                UdpNetMessage udpNetMsg = netMsg as UdpNetMessage;
                var           result    = peer.EncodeMessage(ref udpNetMsg);
                if (result)
                {
                    if (udpSocket != null)
                    {
                        try
                        {
                            var buffer = udpNetMsg.GetBuffer();
                            int length = await udpSocket.SendAsync(buffer, buffer.Length, peer.PeerEndPoint);

                            if (length != buffer.Length)
                            {
                                //消息未完全发送,则重新发送
                                SendMessageAsync(udpNetMsg);
                            }
                        }
                        catch (Exception e)
                        {
                            Utility.Debug.LogError($"Send net message exceotion : {e.Message}");
                        }
                    }
                }
            }
        }
        public override void OnRefresh()
        {
            clientPeerRefreshHandler?.Invoke();
            if (awaitHandle.Count > 0)
            {
                UdpReceiveResult data;
                if (awaitHandle.TryDequeue(out data))
                {
                    UdpNetMessage netMsg = CosmosEntry.ReferencePoolManager.Spawn <UdpNetMessage>();
                    netMsg.DecodeMessage(data.Buffer);
#if DEBUG
                    if (netMsg.Cmd == UdpProtocol.MSG)
                    {
                        Utility.Debug.LogInfo($" OnRefresh KCP_MSG:{netMsg} ;ServiceMessage : {Utility.Converter.GetString(netMsg.ServiceData)},TS:{netMsg.TS}");
                    }
#endif
                    if (netMsg.IsFull)
                    {
                        if (netMsg.Conv == 0)
                        {
                            conv       += 1;
                            netMsg.Conv = conv;
                            UdpClientPeer peer;
                            CreateClientPeer(netMsg, data.RemoteEndPoint, out peer);
                        }
                        if (peerDict.TryGetValue(netMsg.Conv, out var rPeer))
                        {
                            UdpClientPeer tmpPeer = rPeer as UdpClientPeer;
                            //如果peer失效,则移除
                            if (!tmpPeer.Available)
                            {
                                clientPeerRefreshHandler -= tmpPeer.OnRefresh;
                                AbortUnavilablePeer(rPeer);
                            }
                            else
                            {
                                tmpPeer.MessageHandler(netMsg);
                            }
                        }
                        else
                        {
                            //发送终结命令;
                            UdpNetMessage finMsg = UdpNetMessage.EncodeMessage(netMsg.Conv);
                            finMsg.Cmd = UdpProtocol.FIN;
                            SendFINMessageAsync(finMsg, data.RemoteEndPoint);
                        }
                    }
                }
            }
        }
        bool CreateClientPeer(UdpNetMessage udpNetMsg, IPEndPoint endPoint, out UdpClientPeer peer)
        {
            peer = default;
            bool result = false;

            if (!peerDict.ContainsKey(udpNetMsg.Conv))
            {
                peer = CosmosEntry.ReferencePoolManager.Spawn <UdpClientPeer>();
                peer.SetValue(this, onReceiveData, SendMessageAsync, udpNetMsg.Conv, endPoint);
                result = peerDict.TryAdd(udpNetMsg.Conv, peer);
                if (result)
                {
                    onConnected?.Invoke(udpNetMsg.Conv);
                    clientPeerRefreshHandler += peer.OnRefresh;
                }
            }
            return(result);
        }
 public UdpClientService() : base()
 {
     //构造传入0表示接收任意端口收发的数据
     peer = new UdpClientPeer();
     peer.SetValue(SendMessage, OnDeactive, 0, null);
 }