Exemplo n.º 1
0
        private void mainForm_Load(object sender, EventArgs e)
        {
            //获取本机IP
            _localHost = Init.GetLocalIP();
            //启动计算主备机进程
            Thread mainOrStandByThread = new Thread(new ThreadStart(mainOrStandBySwitchMethod));

            mainOrStandByThread.IsBackground = true;
            mainOrStandByThread.Start();

            //启动接收网络UDP消息线程
            Thread UdpThread = new Thread(new ThreadStart(UDP.UdpReceive));

            UdpThread.IsBackground = true;
            UdpThread.Start();
            //探查网络是否正常
            if (Init.PingAll(_tcpInitStandByServerHost))
            {
                //等待8S钟,接收当前系统的主备机状态
                Thread.Sleep(IntervalTime * IntervalDis * 1000);
                //当前系统是否存在主机的情况
                _priority = Init.Priority(_priorityInit);
                //网络正常
                //启动发送心跳
                heartOfTimer.Interval = IntervalTime * 1000;
                heartOfTimer.Enabled  = true;
                heartOfTimer.Start();
            }
            else
            {
                //发出告警
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 计算主备机切换
        /// </summary>
        private void mainOrStandBySwitchMethod()
        {
            while (true)
            {
                try
                {
                    if (Init.PingAll(_tcpInitStandByServerHost))
                    {
                        //显示正常状态
                    }
                    else
                    {
                        //显示异常状态
                        //告警,标红灯
                        listBox1.Items.Add(DateTime.Now.ToString() + "--告警--备机无法连通,请检查网络和备机");
                    }
                    //计算上次接收到主备机到现在的时间长度
                    double lastTimeStandby = (DateTime.Now - _timeStandByLast).TotalSeconds;
                    if (lastTimeStandby > IntervalTime * IntervalDis)
                    {
                        lock (_lockSwitch)
                        {
                            //加锁
                            //说明丢失了周期超过阈值
                            if (_priority == StructNode.Priority.main)
                            {
                                //说明本机是主机,对面是备机
                                //告警,备机掉机
                                _tcpNowStandByServerHost = "";
                                listBox1.Items.Add(DateTime.Now.ToString() + "--告警--网络异常--无法检测到备机心跳,备机掉机");
                            }
                            else
                            {
                                //告警,主机掉机,并发布切换消息
                                listBox1.Items.Add(DateTime.Now.ToString() + "--告警--主机掉机--备机切换到主机模式");
                                _priority           = StructNode.Priority.main;
                                _switchPriorityTime = DateTime.Now;
                                //设置主备机状态

                                //将自己设置成主机
                                //1是设置主机消息
                                string sendInfo = "0x02#Info_Switch_MainOrStandBy#1#" + _localHost + "#" + StructNode.Priority.main.ToString() +
                                                  "#" + DateTime.Now.ToString();
                                //发送
                                byte[] bytes = Encoding.Default.GetBytes(sendInfo);
                                mainForm.thisForm.udpcSend.Send(bytes, bytes.Length, mainForm.thisForm.endpoint_Send);
                                listBox1.Items.Add(DateTime.Now.ToString() + "--发送--切换主备--" + sendInfo);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                }
                Thread.Sleep(1000);
            }
        }