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); }); } }
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); }); } }
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); }
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); }
public void AddCallbackRpc(RpcCommand cmd) { rpcDic[cmd.Id] = cmd; Global.IdManager.RegisterRpcId(cmd.Id, this.Id); }
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); } }