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}"); } } } } }
async void SendFINMessageAsync(INetworkMessage netMsg, IPEndPoint endPoint) { UdpNetMessage udpNetMsg = netMsg as UdpNetMessage; udpNetMsg.TS = Utility.Time.MillisecondTimeStamp(); udpNetMsg.EncodeMessage(); if (udpSocket != null) { try { var buffer = udpNetMsg.GetBuffer(); int length = await udpSocket.SendAsync(buffer, buffer.Length, endPoint); if (length != buffer.Length) { //消息未完全发送,则重新发送 SendFINMessageAsync(udpNetMsg, endPoint); } } catch (Exception e) { Utility.Debug.LogError($"Send net message exceotion:{e.Message}"); } } }
public static UdpNetMessage ConvertToACK(UdpNetMessage srcMsg) { UdpNetMessage ack = CosmosEntry.ReferencePoolManager.Spawn <UdpNetMessage>(); ack.Conv = srcMsg.Conv; ack.SN = srcMsg.SN; ack.Cmd = UdpProtocol.ACK; ack.HeaderCode = srcMsg.HeaderCode; ack.RecurCount = 0; ack.EncodeMessage(); return(ack); }
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); } } } } }
/// <summary> /// 消息构造 /// </summary> /// <param name="udpNetMsg">另一个消息体</param> /// <param name="message">转换为二进制的消息体</param> public UdpNetMessage(UdpNetMessage udpNetMsg, byte[] message) { if (message == null) { Len = 0; } else { Len = (ushort)message.Length; } Conv = udpNetMsg.Conv; SN = udpNetMsg.SN; Cmd = udpNetMsg.Cmd; ServiceData = message; HeaderCode = udpNetMsg.HeaderCode; }
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 override byte[] EncodingMessage(INetworkMessage message) { UdpNetMessage udpNetMsg = message as UdpNetMessage; return(udpNetMsg.EncodeMessage()); }