コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: NetClientP2p.cs プロジェクト: lanicon/EuNet
        /// <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);
            });
        }
コード例 #3
0
ファイル: NetClientP2p.cs プロジェクト: lanicon/EuNet
        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);
                    }
                }
            }
        }
コード例 #4
0
 public void SendMessage(NetDataWriter writer, DeliveryTarget deliveryTarget, DeliveryMethod deliveryMethod)
 {
     NetP2pUnity.Instance.SendP2pMessage(this, writer, deliveryTarget, deliveryMethod);
 }
コード例 #5
0
        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;
            }
        }
コード例 #6
0
ファイル: NetView.cs プロジェクト: christianhood/EuNet
 /// <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);
 }
コード例 #7
0
 void IRequestWaiter.SendRequest(ISession session, NetDataWriter writer, DeliveryMethod deliveryMethod, DeliveryTarget deliveryTarget, int extra)
 {
     session.SessionRequest.Notification(writer.Data, 0, writer.Length, deliveryMethod);
 }