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); }