public async ETTask <Session> OnTransferAsync2(Transfer transfer, Session session2) { Consensus consensus = Entity.Root.GetComponent <Consensus>(); Q2P_Transfer q2p_Transfer = new Q2P_Transfer(); q2p_Transfer.transfer = JsonHelper.ToJson(transfer); var networkInner = Entity.Root.GetComponent <ComponentNetworkInner>(); var nodeList = Entity.Root.GetComponent <NodeManager>().GetNodeList(); // 遍历node提交交易,直到找个一个可以出块的节点 int start = RandomHelper.Random(); for (int i = start; i < start + nodeList.Count; i++) { var node = nodeList[i % nodeList.Count]; Session session = session2 ?? await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); if (session != null && session.IsConnect()) { var r2p_Transfer = (R2P_Transfer)await session.Query(q2p_Transfer, 5); if (r2p_Transfer != null && r2p_Transfer.rel != "-1") { return(session); } } } await Task.Delay(10); return(null); }
// Broadcast to my Kademlia public async void Broadcast2Kad(IMessage message) { NodeData nodeSelf = nodes.Find((n) => { return(n.nodeId == StringHelper.HashCode(networkInner.ipEndPoint.ToString())); }); if (nodeSelf == null) { return; } List <NodeData> result = GetkList(nodeSelf.kIndex); for (int i = 0; i < result.Count; i++) { NodeData node = result[i]; if (node.nodeId != nodeSelf.nodeId) // ignore self { Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); if (session != null && session.IsConnect()) { session.Send(message); } } } }
//[MessageMethod(NetOpcode.Q2P_New_Node)] async void Q2P_New_Node_Handle(Session session, int opcode, object msg) { Q2P_New_Node new_Node = msg as Q2P_New_Node; try { if (new_Node.version != BlockMgr.networkID) { R2P_New_Node response = new R2P_New_Node() { Nodes = "", nodeTime = TimeHelper.Now() }; response.Message = $"Network Version Not Compatible your:{new_Node.version} cur:{BlockMgr.networkID}"; session.Reply(new_Node, response); return; } //Log.Debug($"Q2P_New_Node_Handle {new_Node.address} ipEndPoint: {new_Node.ipEndPoint} 1"); Session sessionNew = await networkInner.Get(NetworkHelper.ToIPEndPoint(new_Node.ipEndPoint), 2); Q2P_IP_INFO qIPNode = new Q2P_IP_INFO(); R2P_IP_INFO rIPNode = (R2P_IP_INFO)await sessionNew.Query(qIPNode, 0.3f); if (rIPNode != null) { NodeData data = new NodeData(); data.nodeId = new_Node.ActorId; data.address = new_Node.address; data.ipEndPoint = new_Node.ipEndPoint; data.state = new_Node.state; data.version = new_Node.version; data.kIndex = GetkIndex(); AddNode(data); R2P_New_Node response = new R2P_New_Node() { Nodes = "", nodeTime = TimeHelper.Now() }; string nodesjson = JsonHelper.ToJson(nodes); if (StringHelper.HashCode(nodesjson) != new_Node.HashCode) { response.Nodes = nodesjson; //session.Send(response); } session.Reply(new_Node, response); return; } } catch (Exception) { } { R2P_New_Node response = new R2P_New_Node() { Nodes = "", nodeTime = TimeHelper.Now() }; response.Message = "LAN not supported or Your network has a firewall"; session.Reply(new_Node, response); } }
public async void OnLogin() { try { IPEndPoint connetEndPoint = NetworkHelper.ToIPEndPoint(ServerIP); Session session = Game.Scene.GetComponent <NetOuterComponent>().Create(connetEndPoint); M2C_Reload M2C_Reload = (M2C_Reload)await session.Call(new C2M_Reload() { Account = nickname.text, Password = password.text }); //connetEndPoint = NetworkHelper.ToIPEndPoint(M2C_Reload.Message); //Session gateSession = Game.Scene.GetComponent<NetOuterComponent>().Create(connetEndPoint); //Game.Scene.AddComponent<SessionComponent>().Session = gateSession; Game.Scene.AddComponent <SessionComponent>().Session = session; G2C_EnterMap G2C_EnterMap = (G2C_EnterMap)await Game.Scene.GetComponent <SessionComponent>().Session.Call(new C2G_EnterMap()); print("登陆gate成功!"); // 创建Player Player player = ETModel.ComponentFactory.CreateWithId <Player>(G2C_EnterMap.UnitId); PlayerComponent playerComponent = ETModel.Game.Scene.GetComponent <PlayerComponent>(); playerComponent.MyPlayer = player; uiLogin.SetActive(false); uiLobby.SetActive(true); } catch (Exception e) { Log.Error(e.ToString()); } }
/// <summary> /// 初始化 /// </summary> /// <param name="protocol">通讯协议 TCP ? KCP ? WEB?</param> /// <param name="address">本地IP地址</param> public void Awake(NetworkProtocol protocol, string address) { try { IPEndPoint ipEndPoint; switch (protocol) { case NetworkProtocol.KCP: ipEndPoint = NetworkHelper.ToIPEndPoint(address); this.Service = new KService(ipEndPoint, this.OnAccept); //传过去 得到客户端AChannel的回调 break; case NetworkProtocol.TCP: ipEndPoint = NetworkHelper.ToIPEndPoint(address); this.Service = new TService(ipEndPoint, this.OnAccept); break; case NetworkProtocol.WebSocket: string[] prefixs = address.Split(';'); this.Service = new WService(prefixs, this.OnAccept); break; } } catch (Exception e) { throw new Exception($"NetworkComponent Awake Error {address}", e); } }
public async void OnTransferAsync(BlockSub transfer) { Consensus consensus = Entity.Root.GetComponent <Consensus>(); Q2P_Transfer q2p_Transfer = new Q2P_Transfer(); q2p_Transfer.transfer = JsonHelper.ToJson(transfer); var networkInner = Entity.Root.GetComponent <ComponentNetworkInner>(); var nodeList = Entity.Root.GetComponent <NodeManager>().GetNodeRandomList(); // 遍历node提交交易,直到找个一个可以出块的节点 for (int i = 0; i < nodeList.Count; i++) { var node = nodeList[i]; Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); if (session != null && session.IsConnect()) { var r2p_Transfer = (R2P_Transfer)await session.Query(q2p_Transfer, 5); if (r2p_Transfer != null && r2p_Transfer.rel != "-1") { break; } } } }
public async Task <string> QueryPrehashmkl(long syncHeight, string ipEndPoint = null) { Q2P_Prehashmkl q2p_PreHash = new Q2P_Prehashmkl(); q2p_PreHash.ActorId = nodeManager.GetMyNodeId(); q2p_PreHash.height = syncHeight; Session session = null; if (ipEndPoint != null && ipEndPoint != "") { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(ipEndPoint)); } if (session != null && !session.IsConnect()) { session = null; } if (session == null) { NodeManager.NodeData node = nodeManager.GetRandomNode(); if (node != null) { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); } } if (session != null) { R2P_Prehashmkl r2p_Prehashmkl = (R2P_Prehashmkl)await session.Query(q2p_PreHash); return(r2p_Prehashmkl != null ? r2p_Prehashmkl.prehashmkl : ""); } return(""); }
public async void Broadcast(IMessage message) { // 向所在桶广播 Broadcast2Kad(message); // 获取广播列表 List <NodeData> result = GetBroadcastNode(); // 剔除自己所在桶 NodeData nodeSelf = nodes.Find((n) => { return(n.nodeId == StringHelper.HashCode(networkInner.ipEndPoint.ToString())); }); if (nodeSelf != null) { NodeData nodeIgnore = result.Find((n) => { return(n.kIndex == nodeSelf.kIndex); }); if (nodeIgnore != null) { result.Remove(nodeIgnore); } } // 开始广播 for (int i = 0; i < result.Count; i++) { NodeData node = result[i]; Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); if (session != null && session.IsConnect()) { session.Send(message); } } }
public async override void Start() { networkInner.ipEndPoint = NetworkHelper.ToIPEndPoint(GetIpV4() + ":" + networkInner.ipEndPoint.Port); Log.Info($"Node:{networkInner.ipEndPoint.ToString()}"); string tmp = Program.jdNode["NodeSessions"].ToString(); List <string> list = JsonHelper.FromJson <List <string> >(tmp); Q2P_New_Node new_Node = new Q2P_New_Node(); new_Node.ActorId = GetMyNodeId(); new_Node.address = Wallet.GetWallet().GetCurWallet().ToAddress(); new_Node.ipEndPoint = networkInner.ipEndPoint.ToString(); Log.Debug($"NodeManager.Start"); while (true && list.Count > 0) { try { for (int ii = 0; ii < list.Count; ii++) { bool bResponse = false; new_Node.HashCode = StringHelper.HashCode(JsonHelper.ToJson(nodes)); new_Node.sendTime = TimeHelper.Now(); Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(list[0])); if (session != null && session.IsConnect()) { //Log.Debug($"NodeSessions connect " + r2P_New_Node.ActorId); //session.Send(new_Node); R2P_New_Node r2P_New_Node = (R2P_New_Node)await session.Query(new_Node, 0.3f); if (r2P_New_Node != null) { if (r2P_New_Node.Nodes != "") { nodes = JsonHelper.FromJson <List <NodeData> >(r2P_New_Node.Nodes); long timeNow = TimeHelper.Now(); nodeTimeOffset = (timeNow - new_Node.sendTime) / 2 + r2P_New_Node.nodeTime - timeNow; } bResponse = true; } } if (bResponse) { break; } } // 等待5秒后关闭连接 await Task.Delay(5 * 1000); } catch (Exception) { await Task.Delay(5 * 1000); } } }
public override void EndInit() { base.EndInit(); if (this.Host2 == null) { this.Host2 = this.Host; } this.ipEndPoint = NetworkHelper.ToIPEndPoint(this.Host, this.Port); this.ipEndPoint2 = NetworkHelper.ToIPEndPoint(this.Host2, this.Port); }
public async void Broadcast2Kad(int kIndex, IMessage message) { List <NodeData> result = GetkList(kIndex); for (int i = 0; i < result.Count; i++) { NodeData node = result[i]; Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); if (session != null && session.IsConnect()) { session.Send(message); } } }
public async void Broadcast(P2P_NewBlock p2p_Block, Block block) { var myNodeId = GetMyNodeId(); for (int i = 0; i < nodes.Count; i++) { NodeData node = nodes[i]; if (node.nodeId != myNodeId) { Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); if (session != null && session.IsConnect()) { session.Send(p2p_Block); } } } }
public async void OnLogin() { SessionWrap sessionWrap = null; try { IPEndPoint connetEndPoint = NetworkHelper.ToIPEndPoint(ServerIP); Session session = Game.Scene.GetComponent <NetOuterComponent>().Create(connetEndPoint); sessionWrap = new SessionWrap(session); R2C_Login r2CLogin = (R2C_Login)await sessionWrap.Call(new C2R_Login() { Account = nickname.text, Password = "******" }); sessionWrap.Dispose(); connetEndPoint = NetworkHelper.ToIPEndPoint(r2CLogin.Address); Session gateSession = Game.Scene.GetComponent <NetOuterComponent>().Create(connetEndPoint); Game.Scene.AddComponent <SessionWrapComponent>().Session = new SessionWrap(gateSession); Game.Scene.AddComponent <SessionComponent>().Session = gateSession; //G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await SessionWrapComponent.Instance.Session.Call(new C2G_LoginGate() { Key = r2CLogin.Key }); G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await Game.Scene.GetComponent <SessionWrapComponent>().Session.Call(new C2G_LoginGate() { Key = r2CLogin.Key }); Log.Info("登陆gate成功!"); // 创建Player Player player = ETModel.ComponentFactory.CreateWithId <Player>(g2CLoginGate.PlayerId); PlayerComponent playerComponent = ETModel.Game.Scene.GetComponent <PlayerComponent>(); playerComponent.MyPlayer = player; uiLogin.SetActive(false); uiLobby.SetActive(true); } catch (Exception e) { Log.Error(e.ToString()); } }
public async Task <Block> QueryBlock(string hash, string ipEndPoint = null) { Q2P_Block q2p_Block = new Q2P_Block(); q2p_Block.ActorId = nodeManager.GetMyNodeId(); q2p_Block.hash = hash; Session session = null; if (ipEndPoint != null && ipEndPoint != "") { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(ipEndPoint)); } if (session != null && !session.IsConnect()) { session = null; } Block blk = null; //if (session == null) { NodeManager.NodeData node = nodeManager.GetRandomNode(); if (node != null) { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); } } if (session != null) { R2P_Block r2p_Block = (R2P_Block)await session.Query(q2p_Block); if (r2p_Block != null && r2p_Block.block != "") { blk = JsonHelper.FromJson <Block>(r2p_Block.block); } } return(blk); }
public async Task <string> QueryMcBlockHash(long height, string ipEndPoint = null) { Q2P_McBlockHash q2p_mcBlockHash = new Q2P_McBlockHash(); q2p_mcBlockHash.ActorId = nodeManager.GetMyNodeId(); q2p_mcBlockHash.height = height; Session session = null; if (ipEndPoint != null && ipEndPoint != "") { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(ipEndPoint)); } if (session != null && !session.IsConnect()) { session = null; } string hash = ""; if (session == null) { NodeManager.NodeData node = nodeManager.GetRandomNode(); if (node != null) { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); } } if (session != null) { R2P_McBlockHash r2p_McBlock = (R2P_McBlockHash)await session.Query(q2p_mcBlockHash); if (r2p_McBlock != null) { hash = r2p_McBlock.hash; } } return(hash); }
public void Awake(NetworkProtocol protocol, string address) { try { IPEndPoint ipEndPoint; switch (protocol) { case NetworkProtocol.TCP: ipEndPoint = NetworkHelper.ToIPEndPoint(address); this.Service = new TService(ipEndPoint, this.OnAccept) { Parent = this }; break; } } catch (Exception e) { throw new Exception($"NetworkComponent Awake Error {address}", e); } }
// 如果收到的是桶外的数据 , 向K桶内进行一次广播 public bool IsNeedBroadcast2Kad(string _ipEndPoint) { if (string.IsNullOrEmpty(_ipEndPoint)) { return(false); } var ipEndPoint = NetworkHelper.ToIPEndPoint(_ipEndPoint); NodeData nodetarget = nodes.Find((n) => { return(n.nodeId == StringHelper.HashCode(_ipEndPoint)); }); NodeData nodeSelf = nodes.Find((n) => { return(n.nodeId == GetMyNodeId()); }); if (nodetarget != null && nodeSelf != null) { if (nodetarget.kIndex != nodeSelf.kIndex) { return(true); } } return(false); }
public void Awake(NetworkProtocol protocol, string address, int packetSize = Packet.PacketSizeLength2) { try { IPEndPoint ipEndPoint; switch (protocol) { case NetworkProtocol.KCP: ipEndPoint = NetworkHelper.ToIPEndPoint(address); this.Service = new KService(ipEndPoint, this.OnAccept) { Parent = this }; break; case NetworkProtocol.TCP: ipEndPoint = NetworkHelper.ToIPEndPoint(address); //OnAccept客户端连接后的处理回调 同时将自己设置为TService的Parent父物体 //那么这个外网组件销毁的时候 会将TService也销毁 this.Service = new TService(packetSize, ipEndPoint, this.OnAccept) { Parent = this }; break; case NetworkProtocol.WebSocket: string[] prefixs = address.Split(';'); this.Service = new WService(prefixs, this.OnAccept) { Parent = this }; break; } } catch (Exception e) { throw new Exception($"NetworkComponent Awake Error {address}", e); } }
public async Task <List <string> > QueryBeLinkHash(string hash, string ipEndPoint = null) { Q2P_BeLinkHash q2p_BeLinkHash = new Q2P_BeLinkHash(); q2p_BeLinkHash.ActorId = nodeManager.GetMyNodeId(); q2p_BeLinkHash.hash = hash; Session session = null; if (ipEndPoint != null && ipEndPoint != "") { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(ipEndPoint)); } if (session != null && !session.IsConnect()) { session = null; } if (session == null) { NodeManager.NodeData node = nodeManager.GetRandomNode(); if (node != null) { session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); } } if (session != null) { R2P_BeLinkHash r2p_BeLinkHash = (R2P_BeLinkHash)await session.Query(q2p_BeLinkHash); if (r2p_BeLinkHash != null && r2p_BeLinkHash.hashs != null && r2p_BeLinkHash.hashs != "") { return(JsonHelper.FromJson <List <string> >(r2p_BeLinkHash.hashs)); } } return(null); }
public void Awake(NetworkProtocol protocol, string address, int packetSize = Packet.PacketSizeLength4) { try { IPEndPoint ipEndPoint; switch (protocol) { case NetworkProtocol.KCP: ipEndPoint = NetworkHelper.ToIPEndPoint(address); this.Service = new KService(ipEndPoint, (channel) => { this.OnAccept(channel); }) { Parent = this }; break; case NetworkProtocol.TCP: ipEndPoint = NetworkHelper.ToIPEndPoint(address); this.Service = new TService(packetSize, ipEndPoint, (channel) => { this.OnAccept(channel); }) { Parent = this }; break; case NetworkProtocol.WebSocket: string[] prefixs = address.Split(';'); this.Service = new WService(prefixs, (channel) => { this.OnAccept(channel); }) { Parent = this }; break; } } catch (Exception e) { throw new Exception($"NetworkComponent Awake Error {address}", e); } }
public override void EndInit() { base.EndInit(); this.IPEndPoint = NetworkHelper.ToIPEndPoint(this.Host, this.Port); }
public override AChannel ConnectChannel(string address) { IPEndPoint ipEndPoint = NetworkHelper.ToIPEndPoint(address); return(this.ConnectChannel(ipEndPoint)); }
public override void Awake(JToken jd = null) { if (jd == null) { return; } if (jd.Parent != null && jd.Parent.Parent != null && jd.Parent.Parent["appType"] != null) { string[] array = jd.Parent.Parent["appType"].ToString().Replace(" ", "").Split('|'); for (int i = 0; i < array.Length; i++) { if (array[i] != "") { appType |= (int)Enum.Parse(typeof(AppType), array[i]); } } } protocol = NetworkProtocol.TCP; if (jd["protocol"] != null) { Enum.TryParse <NetworkProtocol>(jd["protocol"].ToString(), out protocol); } address = jd["address"]?.ToString(); if (address != null && address != "" && protocol != NetworkProtocol.HttpSocket) { ipEndPoint = NetworkHelper.ToIPEndPoint(address); } else { ipEndPoint = new IPEndPoint(IPAddress.Any, 0); } if (jd["MessagePacker"]?.ToString() == "ProtobufPacker") { MessagePacker = new ProtobufPacker(); } else { MessagePacker = new MongoPacker(); } try { switch (protocol) { case NetworkProtocol.KCP: this.Service = new KService(ipEndPoint, this.OnAccept); break; case NetworkProtocol.TCP: this.Service = new TService(ipEndPoint, this.OnAccept); break; case NetworkProtocol.WebSocket: this.Service = new WService(address.Split(';'), this.OnAccept); break; case NetworkProtocol.HttpSocket: string[] prefixs = address.Split(';'); Boolean.TryParse(jd["website"]?.ToString(), out bool website); this.Service = new HttpService(prefixs[0], website, this.OnAccept); break; } } catch (Exception e) { Log.Debug($"创建KService失败!{e.Message}"); //throw new Exception($"NetworkComponent Awake Error {address}", e); } ipEndPoint = this.Service.GetEndPoint(); IdGenerater.AppId = ipEndPoint.Port; if (jd["CheckHearBeat"] != null && this.Service != null) { this.Service.CheckHearBeat = jd["CheckHearBeat"].ToObject <bool>(); } if (jd["CheckKcpWaitsnd"] != null && this.Service != null) { this.Service.CheckKcpWaitsnd = jd["CheckKcpWaitsnd"].ToObject <bool>(); } }
public override IPEndPoint GetEndPoint() { return(NetworkHelper.ToIPEndPoint(prefix.ToLower().Replace("http://", "").Replace("/", ""))); }
public override void EndInit() { this.IPEndPoint = NetworkHelper.ToIPEndPoint(this.Address); }
public async void Run(bool bRun) { await Task.Delay(1 * 1000); List <string> list = JsonHelper.FromJson <List <string> >(Program.jdNode["NodeSessions"].ToString()); // Get Internet IP try { Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(list[0])); Q2P_IP_INFO qIPNode = new Q2P_IP_INFO(); R2P_IP_INFO rIPNode = (R2P_IP_INFO)await session.Query(qIPNode, 0.3f); networkInner.ipEndPoint = NetworkHelper.ToIPEndPoint(GetIpV4() + ":" + networkInner.ipEndPoint.Port); if (rIPNode != null) { networkInner.ipEndPoint = NetworkHelper.ToIPEndPoint(rIPNode.address + ":" + networkInner.ipEndPoint.Port); } } catch (Exception) { } Log.Info($"NodeManager {networkInner.ipEndPoint.ToString()}"); Log.Info($"NodeSessions {list[0]}"); // Q2P_New_Node new_Node = new Q2P_New_Node(); new_Node.ActorId = GetMyNodeId(); new_Node.address = Wallet.GetWallet().GetCurWallet().ToAddress(); new_Node.ipEndPoint = networkInner.ipEndPoint.ToString(); long state = 0; var consensus = Entity.Root.GetComponent <Consensus>(); if (consensus != null) { state |= consensus.transferShow ? EnumState.transferShow : 0; state |= consensus.openSyncFast ? EnumState.openSyncFast : 0; } state |= Entity.Root.GetComponentInChild <RelayNetwork>() != null ? EnumState.RelayNetwork : 0; new_Node.state = state; new_Node.version = BlockMgr.networkID; while (bRun && list.Count > 0) { try { for (int ii = 0; ii < list.Count; ii++) { bool bResponse = false; new_Node.HashCode = StringHelper.HashCode(JsonHelper.ToJson(nodes)); Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(list[ii])); if (session != null && session.IsConnect()) { //Log.Debug($"NodeSessions connect " + r2P_New_Node.ActorId); //session.Send(new_Node); long sendTime = TimeHelper.Now(); R2P_New_Node r2P_New_Node = (R2P_New_Node)await session.Query(new_Node, 3f); if (r2P_New_Node != null) { long timeNow = TimeHelper.Now(); nodeTimeOffset = (timeNow - sendTime) / 2 + r2P_New_Node.nodeTime - timeNow; if (!string.IsNullOrEmpty(r2P_New_Node.Nodes)) { nodes = JsonHelper.FromJson <List <NodeData> >(r2P_New_Node.Nodes); } if (!string.IsNullOrEmpty(r2P_New_Node.Message)) { Log.Warning($"NodeSessions: {r2P_New_Node.Message}"); } bResponse = true; } } if (bResponse) { break; } } // 等待5秒后关闭连接 await Task.Delay(5 * 1000); } catch (Exception) { await Task.Delay(5 * 1000); } } }