Beispiel #1
0
        public override void CallMethod(Packet packet)
        {
            bool isCallback = rpcDic.ContainsKey(packet.Id);

            if (!isCallback)
            {
                isCallback = Global.IdManager.GetRpcId(packet.Id) != 0;
            }

            if (isCallback)
            {
                if (!rpcDic.TryGetValue(packet.Id, out var cmd))
                {
                    var aId = Global.IdManager.GetRpcId(packet.Id);
                    this.actorDic.TryGetValue(aId, out var actor);
                    cmd = actor.GetRpc(packet.Id);
                }

                RemoveRpc(cmd.Id);
                cmd.Callback(packet.Payload);
            }
            else
            {
                var cmd = RpcCommand.Create(packet, null, this);
                cmd.Call(() => {
                    RemoveRpc(cmd.Id);
                });
            }
        }
Beispiel #2
0
        public virtual void CallMethod(Packet packet)
        {
            bool isCallback = packet.ProtoCode < 0;

            //if(!isCallback)
            //    isCallback = rpcDic.ContainsKey(packet.Id);
            //if (!isCallback)
            //    isCallback = rpcTimeoutDic.ContainsKey(packet.Id);

            if (isCallback)
            {
                if (!rpcDic.TryGetValue(packet.Id, out var cmd))
                {
                    Log.Error("rpc_id_not_found", packet.Id, packet.ProtoCode, packet.MsgType, packet.NetType);
                    return;
                }

                RemoveRpc(cmd.Id);
                cmd.Callback(packet.Payload);
            }
            else
            {
                var cmd = RpcCommand.Create(packet, null, this);
                cmd.Call(() => {
                    RemoveRpc(cmd.Id);
                });
            }
        }
Beispiel #3
0
        public static RpcCommand Create(Packet packet, Action <byte[]> cb, Entity invoker)
        {
            var obj = new RpcCommand();

            obj.packet         = packet;
            obj.callbackMethod = cb;
            obj.mInvoker       = invoker;
            return(obj);
        }
Beispiel #4
0
        public void Rpc(uint protoCode, ulong fromHostId, ulong fromActorId, ulong toHostId, ulong toActorId,
                        IPEndPoint toPeerAddr, NetworkType netType, IMessage msg, Action <byte[]> cb)
        {
            var packet = Packet.Create(Basic.GenID64(), protoCode, fromHostId, toHostId, fromActorId, toActorId, netType, msg.GetType(), msg.Pack());

            /*创建一个等待回调的rpc_command*/
            var cmd = RpcCommand.Create(
                packet,
                (data) => { RemoveRpc(packet.Id); cb?.Invoke(data); },
                this);

            //如果是同进程,则本地调用
            if (fromHostId == toHostId)
            {
                var toActor = Global.Host.GetActor(toActorId);

                if (msg.HasCallback())
                {
                    AddCallbackRpc(cmd);
                }
                toActor.CallMethod(packet);
                return;
            }

            //否则通过网络调用
            var peer = Global.NetManager.GetPeerById(toHostId, netType);

            //Log.Info(string.Format("{0} {1} {2} {3} {4}", fromHostId, toHostId, fromActorId, toActorId, peer==null?"NULL":""));
            if (peer == null)
            {
                Log.Warn(string.Format("Rpc:cannot_find_peer_and_create {0} => {1} ({2})", fromHostId, toHostId, netType));
                peer = Global.NetManager.CreatePeer(toHostId, toPeerAddr, netType);
            }

            if (peer == null || !peer.IsActive)
            {
                Log.Error(string.Format("Rpc:peer disconnected {0}", toHostId), toPeerAddr, netType);
                //这里可以尝试把global以及redis状态清空
                if (peer == null)
                {
                    Global.NetManager.RemovePeerId(toHostId);
                }
                else
                {
                    Global.NetManager.Deregister(peer);
                }
                cb?.Invoke(null);
                return;
            }

            if (msg.HasCallback())
            {
                AddCallbackRpc(cmd);
            }

            Global.NetManager.Send(peer, packet);
        }
Beispiel #5
0
 public void AddCallbackRpc(RpcCommand cmd)
 {
     rpcDic[cmd.Id] = cmd;
     Global.IdManager.RegisterRpcId(cmd.Id, this.Id);
 }
Beispiel #6
0
        public void Rpc(int protoCode, ulong fromHostId, ulong fromActorId, ulong toHostId, ulong toActorId,
                        IPEndPoint toPeerAddr, NetworkType netType, IMessage msg, Action <byte[]> cb)
        {
            try
            {
                var packet = Packet.Create(Basic.GenID64(), protoCode, fromHostId, toHostId, fromActorId, toActorId, netType, msg.GetType(), msg.Pack());

                /*创建一个等待回调的rpc_command*/
                var cmd = RpcCommand.Create(
                    packet,
                    (data) => { RemoveRpc(packet.Id); cb?.Invoke(data); },
                    this);

                //如果是同进程,则本地调用
                if (fromHostId == toHostId)
                {
                    if (Math.Abs(protoCode) < OpCode.CALL_ACTOR_METHOD)
                    {
                        if (msg.HasCallback())
                        {
                            AddCallbackRpc(cmd);
                        }

                        Global.Host.CallMethod(packet);
                        return;
                    }
                    else
                    {
                        var toActor = Global.Host.GetActor(toActorId);

                        if (msg.HasCallback())
                        {
                            AddCallbackRpc(cmd);
                        }

                        toActor.CallMethod(packet);
                        return;
                    }
                }

                bool isClient = Global.IdManager.IsClientHost(toHostId);

                //否则通过网络调用
                //如果是客户端,则直接用remote netpeer返回包
                //如果是服务端,则用local netpeer返回包
                var peer = isClient ? Global.NetManager.GetRemotePeerById(toHostId, netType) : Global.NetManager.GetLocalPeerById(toHostId, netType);
                //Log.Info(string.Format("{0} {1} {2} {3} {4}", fromHostId, toHostId, fromActorId, toActorId, peer==null?"NULL":""));
                if (peer == null)
                {
                    Log.Warn(string.Format("Rpc:cannot_find_peer_and_create {0} => {1} ({2})", fromHostId, toHostId, netType));
                    peer = Global.NetManager.CreatePeer(toHostId, toPeerAddr, netType);
                }

                if (peer == null || !peer.IsActive)
                {
                    Log.Error(string.Format("Rpc:peer disconnected {0}", toHostId), toPeerAddr, netType);
                    //这里可以尝试把global以及redis状态清空
                    if (peer == null)
                    {
                        Global.NetManager.RemovePeerId(toHostId);
                    }
                    else
                    {
                        Global.NetManager.Deregister(peer);
                    }
                    cb?.Invoke(null);
                    return;
                }

                if (msg.HasCallback())
                {
                    AddCallbackRpc(cmd);
                }

                Global.NetManager.Send(peer, packet);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
        }