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 { //发出告警 } }
/// <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); } }