/// <summary> /// P2P 메시지를 다른유저들이 같은 ViewId를 가진 NetView에게 전달함. /// </summary> /// <param name="view">메시지를 전달할 NetView</param> /// <param name="writer">메시지 데이터</param> /// <param name="deliveryTarget">전송 타겟</param> /// <param name="deliveryMethod">전송 방식</param> public void SendP2pMessage(INetView view, NetDataWriter writer, DeliveryTarget deliveryTarget, DeliveryMethod deliveryMethod) { if (IsLocalMode == true) { return; } Client.SendP2pMessage(view, writer, deliveryTarget, deliveryMethod); }
/// <summary> /// P2P 메시지를 다른유저들이 같은 ViewId를 가진 NetView에게 전달함. /// </summary> /// <param name="view">메시지를 전달할 NetView</param> /// <param name="writer">메시지 데이터</param> /// <param name="deliveryTarget">전송 타겟</param> /// <param name="deliveryMethod">전송 방식</param> public void SendP2pMessage(INetView view, NetDataWriter writer, DeliveryTarget deliveryTarget, DeliveryMethod deliveryMethod) { NetPool.DataWriterPool.Use((NetDataWriter w) => { w.Write((ushort)NetProtocol.P2pMessage); w.Write(view.ViewId); w.Write(writer); SendP2pInternal(w, deliveryTarget, deliveryMethod); }); }
private void SendP2pInternal( NetDataWriter writer, DeliveryTarget deliveryTarget, DeliveryMethod deliveryMethod) { if (deliveryMethod == DeliveryMethod.Tcp) { _logger.LogError("not support tcp transfer in p2p"); return; } if (P2pGroup == null) { _logger.LogWarning("No joined any P2pGroup"); return; } if (deliveryTarget == DeliveryTarget.All) { P2pGroup.SendAll(writer, deliveryMethod); _readerForSendInternal.SetSource(writer); OnP2pReceive(this, _readerForSendInternal); } else if (deliveryTarget == DeliveryTarget.Others) { P2pGroup.SendAll(writer, deliveryMethod); } else if (deliveryTarget == DeliveryTarget.Master) { var member = P2pGroup.Find(P2pGroup.MasterSessionId); if (member != null) { if (member.IsMine()) { // 내가 마스터라면 바로 호출함 _readerForSendInternal.SetSource(writer); OnP2pReceive(this, _readerForSendInternal); } else { member.SendAsync(writer, deliveryMethod); } } } }
public void SendMessage(NetDataWriter writer, DeliveryTarget deliveryTarget, DeliveryMethod deliveryMethod) { NetP2pUnity.Instance.SendP2pMessage(this, writer, deliveryTarget, deliveryMethod); }
void IRequestWaiter.SendRequest(ISession session, NetDataWriter writer, DeliveryMethod deliveryMethod, DeliveryTarget deliveryTarget, int extra) { NetClient client = session as NetClient; if (client == null) { throw new Exception($"Session must be NetClient instance"); } if (client.State != SessionState.Connected) { Debug.LogWarning("[NetViewRequestWaiter.SendRequest] Not connected to server"); return; } if (client.P2pGroup == null) { Debug.LogWarning("[NetViewRequestWaiter.SendRequest] Not joined p2p group"); return; } switch (deliveryTarget) { case DeliveryTarget.All: { // 다른사람들 보냄 client.P2pGroup.ViewNotification(writer.Data, 0, writer.Length, View.ViewId, deliveryMethod); // 나를 호출함 CallSelfNotification(client, writer, deliveryMethod); } break; case DeliveryTarget.Others: { // 다른사람들 보냄 client.P2pGroup.ViewNotification(writer.Data, 0, writer.Length, View.ViewId, deliveryMethod); } break; case DeliveryTarget.Master: { if (client.P2pGroup.MasterIsMine()) { // 자신이 마스터임 CallSelfNotification(client, writer, deliveryMethod); } else { // 다른유저가 마스터임 var target = client.P2pGroup.GetMasterMember(); if (target == null) { return; } target.ViewNotification(writer.Data, 0, writer.Length, View.ViewId, deliveryMethod); } } break; case DeliveryTarget.Target: { ushort targetSessionId = (ushort)extra; if (targetSessionId == 0) { throw new Exception("Target's SessionId must not be 0"); } if (client.SessionId == targetSessionId) { // 본인이 타겟임 CallSelfNotification(client, writer, deliveryMethod); } else { var target = client.P2pGroup.Find(targetSessionId); if (target == null) { return; } target.ViewNotification(writer.Data, 0, writer.Length, View.ViewId, deliveryMethod); } } break; } }
/// <summary> /// P2P 유저에게 데이터 전송 /// </summary> /// <param name="dataWriter">전송할 데이터</param> /// <param name="deliveryTarget">전송 타겟</param> /// <param name="deliveryMethod">전송 방식</param> public void SendMessage(NetDataWriter dataWriter, DeliveryTarget deliveryTarget, DeliveryMethod deliveryMethod) { NetClientGlobal.Instance.SendP2pMessage(this, dataWriter, deliveryTarget, deliveryMethod); }
void IRequestWaiter.SendRequest(ISession session, NetDataWriter writer, DeliveryMethod deliveryMethod, DeliveryTarget deliveryTarget, int extra) { session.SessionRequest.Notification(writer.Data, 0, writer.Length, deliveryMethod); }