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


    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;
                }  
            }
  • 相关阅读:
    实验5&期中考试后两题
    实验四——再探类
    实验3—初识类
    10.29算法训练——poj1475双重BFS
    10.25算法训练——裸线段树
    探索邻接表
    Hadoop学习之Combiner
    关于VLM模式下linux压缩根目录空间的心得
    C#微信公众号开发系列教程四(接收普通消息)
    c#分部类型详解
  • 原文地址:https://www.cnblogs.com/fyp7077/p/7511509.html
Copyright © 2020-2023  润新知