插座断电提醒(测试阶段)

1插座断电有3处会有窗口提醒(任务管理器断开客户端 模拟插座断电)

第一处:IOException

        /// <summary>
        /// 客户端通讯回调函数
        /// </summary>
        /// <param name="ar"></param>
        private void TCPCallBack(IAsyncResult ar)
        {
            LeafTCPClient client = (LeafTCPClient)ar.AsyncState;
            try
            {
               
                if (client.NetWork.Connected)
                {
                    NetworkStream ns = client.NetWork.GetStream();
                    byte[] recdata = new byte[ns.EndRead(ar)];//这里很好 recdata数组长度就是获得数据的长度  收到六个字节的数据,则recdata.Length=6   远程异常关闭时,执行完这句话后发生IOException异常
                    if (recdata.Length > 0)
                    {
                        Array.Copy(client.buffer, recdata, recdata.Length);
                        if (DataReceived != null)
                        {
                            DataReceived.BeginInvoke(client.Name, recdata, null, null);//异步输出数据到UI界面
                        }
                        DataProcess(client, recdata);//对收到的数据进行处理
                        ns.BeginRead(client.buffer, 0, client.buffer.Length, new AsyncCallback(TCPCallBack), client); //继续接收该客户端发来的数据
                    }
                    else
                    {
                        client.DisConnect();
                        lstClient.Remove(client);
                        BindLstClient();
                    }
                }
            }
            catch (IOException ex)
            {
                //远程连接已经断开    无法从传输连接中读取数据
                KillMessageBox killbox = new KillMessageBox();
                killbox.StartKiller();
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); 
   //ex = {"无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。"} } }

第3处:

        // yy 定时器中断函数
        void TimerHander(object source, ElapsedEventArgs e)
       {

            
           try
            {
                bool AllTestDeviceBreakWarm = false;
                if (TestlstClient.Count > 0)
                {
                    bool IsSendOK = true;
                    List<LeafTCPClient> WaitRemove = new List<LeafTCPClient>();

                        foreach (LeafTCPClient sclient in TestlstClient)
                        {
                            if (sclient.relayon == false)
                            {
                                 IsSendOK = NewSendData(sclient, openstring);//继电器开
                                
                            }
                            else
                            {
                                 IsSendOK = NewSendData(sclient, offstring);//继电器关
                                
                            }
                            if (IsSendOK == false)//命令发送失败,可能远程连接断开
                            {
                                WaitRemove.Add(sclient);
                            }
                            else
                            { 
                                sclient.relayon=!sclient.relayon;
                            }
                        }
                    
                        foreach (LeafTCPClient tclient in WaitRemove)//删除旧的client
                        {
                            tclient.DisConnect();
                            lstClient.Remove(tclient);
                            TestlstClient.Remove(tclient);
                            BindLstClient();
                            //检查下TestlstClient列表都被移除了,count=0
                            if (TestlstClient.Count == 0)
                                AllTestDeviceBreakWarm = true;

                            KillMessageBox killbox = new KillMessageBox();
                            killbox.StartKiller();
                            MessageBox.Show(String.Format("设备{0},{1}断开网络,请检查!", tclient.userid, tclient.deviceid),"错误");
                        }

                }
                else
                {
                    if (AllTestDeviceBreakWarm == true)
                    {
                        KillMessageBox killbox = new KillMessageBox();
                        killbox.StartKiller();
                        MessageBox.Show("没有测试的设备与服务器建立连接,请重连","错误");//只提示一次
                        AllTestDeviceBreakWarm = false;
                    }
                    
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);    
//第3处异常提醒位置 ex = {"集合已修改;可能无法执行枚举操作。"} } }

第二处:

        public bool NewSendData(LeafTCPClient client, byte[] data)
        {
            try
            {
                //if(client.NetWork.Connected)
                client.NetWork.GetStream().Write(data, 0, data.Length);//向客户端发送数据
                return true;
            }
            catch (InvalidOperationException ex)//发送数据失败,远程连接异常断开 (如插座断电情况)
            {
                lstClient.Remove(client);
                TestlstClient.Remove(client);
                KillMessageBox killbox = new KillMessageBox();//5分钟后关闭提示窗口
                killbox.StartKiller();
                MessageBox.Show("设备" + client.userid + "," + client.deviceid + ":" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);    //这里第二处窗口提示  ex = {"不允许对非连接的套接字执行此操作。"}
                return false;
            }
            catch (Exception ex)
            {
                KillMessageBox killbox = new KillMessageBox();//5分钟后关闭提示窗口
                killbox.StartKiller();
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }  
        }

 

posted on 2017-09-12 18:04  马勇123  阅读(295)  评论(0编辑  收藏  举报

导航