/// <summary> /// 新增主题 /// </summary> /// <param name="data"></param> private void ProcessNewToic(byte[] data, int len) { var msg = DataPack.UnPackNewTopic(data, len); //添加到本地 AddressInfo info = new AddressInfo(); info.Reset(msg.Address); Debug.WriteLine("接收,ProcessNewToic:" + msg.Address); var lst = PublishList.Publish.AddNode(msg.TopicName, new AddressInfo[] { info }); SubscribeMgr.Instance.NewTopicRec(msg.TopicName, lst.ToArray());//订阅 if (!string.IsNullOrEmpty(LocalNode.TopicAddress)) { //还没有完成初始化就不会返回 byte[] tmp = DataPack.PackNewTopicRsp(msg.TopicName, LocalNode.NodeId, LocalNode.TopicAddress); multicast.SendTo(tmp); //组播信息需要桥接 PTPMultCast.Instance.Send(tmp); } }
/// <summary> /// 广播新主题 /// </summary> /// <param name="topic"></param> public void SendNewTopic(string topic) { MulticastSocket multicast = new MulticastSocket(); int num = WaitNum; var bytes = DataPack.PackNewTopic(topic, LocalNode.NodeId, LocalNode.TopicAddress); while (!NodeListener.Instance.IsComplete(topic)) { num--; multicast.SendTo(bytes); Thread.Sleep(50); if (num < 0) { break; } } //组播信息需要桥接 PTPMultCast.Instance.Send(bytes); multicast.Close(); }
/// <summary> /// 心跳包 /// </summary> private void Heart() { Task.Factory.StartNew(() => { var msg = DataPack.PackNodeState(LocalNode.NodeId, LocalNode.TopicAddress); Multicast.SendTo(msg); // if (NodeList.LstNodeInfo.Count == 0) { int num = NodeList.dicRefresh.Count; string[] keys = new string[num]; NodeList.dicRefresh.Keys.CopyTo(keys, 0); NodeList.LstNodeInfo.AddRange(keys); //取出ID foreach (var ky in keys) { int index = ky.IndexOf(","); string id = ky.Substring(0, index); NodeList.UpdateListId.Add(long.Parse(id)); } } else { var array = NodeList.LstNodeInfo.ToArray(); foreach (var node in array) { int Sp = 0; NodeList.dicRefresh.TryGetValue(node, out Sp); if (Math.Abs(DateTime.Now.Second - Sp) / WaitTime > 2) { //启动侦测 int index = node.IndexOf(","); string addr = node.Substring(index); string[] address = addr.Split('_'); if (address[0] == "0") { TcpClientSocket tcpClient = new TcpClientSocket(); tcpClient.RemoteHost = address[0]; tcpClient.RemotePort = int.Parse(address[1]); if (tcpClient.Connect()) { //刷新 NodeList.dicRefresh[node] = DateTime.Now.Second; } else { //移除节点信息 string id = node.Substring(0, index); NodeList.LstNodeInfo.Remove(node); NodeList.UpdateListId.Remove(long.Parse(id)); AddressInfo info = new AddressInfo(); info.Reset(addr); SubscribeList.Subscribe.Remove(info); } } else { //UDPSocket uDP = new UDPSocket(); UDPSocketPack uDP = new UDPSocketPack(); byte[] buf = new byte[1024]; int num = WaitTectNum; while (num > 0) { uDP.Send(address[0], int.Parse(address[1]), tectBytes); var tsk = Task.Factory.StartNew(() => { return(uDP.Recvice(buf));//有数据返回就说明收到了; }); if (tsk.Wait(100)) { NodeList.dicRefresh[node] = DateTime.Now.Second; break; } num--; } if (num <= 0) { //移除节点信息 NodeList.LstNodeInfo.Remove(node); AddressInfo info = new AddressInfo(); info.Reset(addr); SubscribeList.Subscribe.Remove(info); string id = node.Substring(0, index); NodeList.UpdateListId.Remove(long.Parse(id)); } uDP.Close(); } } } } }); }