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; } }