示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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();
        }
示例#3
0
 /// <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();
                     }
                 }
             }
         }
     });
 }