/// <summary> /// 客户端连接初始化 /// </summary> /// <param name="o"></param> private void Acceptor(IAsyncResult o) { TcpListener server = o.AsyncState as TcpListener; try { //初始化连接的客户端 CollectTCPClient newClient = new CollectTCPClient(); newClient.NetWork = server.EndAcceptTcpClient(o); lstConn.Invoke(new MethodInvoker(delegate { //在lstConn中添加的是CollectTCPClient类型,所以在事件 //tebcontrol_SelectedIndexChanged中提取时也只能强制类型转换成 //CollectTCPClient,然后再进行其他操作,那么类CollectTCPClient的设计就至关重要 lstConn.Items.Add(newClient); })); newClient.NetWork.GetStream().BeginRead(newClient.buffer, 0, newClient.buffer.Length, new AsyncCallback(TCPCallBack), newClient); server.BeginAcceptTcpClient(new AsyncCallback(Acceptor), server);//继续监听客户端连接 } catch (ObjectDisposedException ex) { //监听被关闭 // MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { //MessageBox.Show(ex.Message, "Acceptor错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void lstConn_SelectedIndexChanged(object sender, EventArgs e) { //选中某个客户端 //立刻找客户端要数据,并打开一个timer1定时器,每8s发送一次check_beat要数据 string[] str; if (lstConn.SelectedItems.Count > 0) { try { byte[] check_beat = { 0xaa, 0xdd, 0x01, 0x32, 0x88, 0xEE }; CollectTCPClient selClient = (CollectTCPClient)lstConn.SelectedItem; IPEndPoint iepR = (IPEndPoint)selClient.NetWork.Client.RemoteEndPoint; str = selClient.Name.Split('-'); textBox_addp.Text = str[1]; //Advice:这里还是要加入查询指令,我感觉软件自动退出是没有安装,软件不稳定造成的 //安装完成后,咱在测试。 selClient.NetWork.GetStream().Write(check_beat, 0, check_beat.Length); /* * NOTE : 这个地方狂点会崩,为避免由于狂点引起的程序 * 崩溃,添加一个弹出框。 */ MessageBox.Show("成功查询 " + str[1] + " 的数据"); Period_Inquiry(); } catch { } } }
/// <summary> /// 对当前选中的客户端发送数据 /// </summary> /// <param name="sender"></param> /// <param name="data"></param> public bool SendData(byte[] data) { if (lstConn.SelectedItems.Count > 0) { for (int i = 0; i < lstConn.SelectedItems.Count; i++) { CollectTCPClient selClient = (CollectTCPClient)lstConn.SelectedItems[i]; try { selClient.NetWork.GetStream().Write(data, 0, data.Length); } catch (Exception ex) { /** * Kabuto 2018/07/26 * 取消传输失误弹出消息框,改为放在列表消失时弹出 **/ // MessageBox.Show(selClient.Name + ":" + ex.Message, "SendData错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } } return(true); } else { //MessageBox.Show("无可用客户端", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } }
private void button_band_Click_1(object sender, EventArgs e) { //绑定地名按钮 if (lstConn.SelectedItems.Count > 0) { CollectTCPClient selClient = (CollectTCPClient)lstConn.SelectedItem; try { selClient.SetName(textBox_addp.Text, 1); StreamWriter fileWriter = new StreamWriter("addr_ip.rng", true, Encoding.Default); fileWriter.WriteLine(selClient.Name); fileWriter.Flush(); //立即将数据写入addr_ip.rgn文件 fileWriter.Close(); MessageBox.Show(selClient.Name + "\r\n绑定成功!", "提示"); lstConn.Invoke(new MethodInvoker(delegate { lstConn.Items.Remove(selClient); lstConn.Items.Add(selClient); })); //if(textBox_addp.Text != null) //{ // paf.comboxArea.Items.Add(textBox_addp.Text); //} //lstClient.Remove(selClient); //lstClient.Add(selClient); //BindLstClient(); } catch (Exception ex) { MessageBox.Show(selClient.Name + ": 绑定地名失败,请重试!", "绑定地名失败", MessageBoxButtons.OK, MessageBoxIcon.Error); //return false; } } else { MessageBox.Show("无可用客户端", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); // return false; } }
/// <summary> /// 客户端通讯回调函数 /// </summary> /// <param name="ar"></param> private void TCPCallBack(IAsyncResult ar) { CollectTCPClient client = (CollectTCPClient)ar.AsyncState; try { if (client.NetWork.Connected) { NetworkStream ns = client.NetWork.GetStream(); byte[] recdata = new byte[ns.EndRead(ar)]; if (recdata.Length > 0) { Array.Copy(client.buffer, recdata, recdata.Length); if (DataReceived != null) { DataReceived.BeginInvoke(client, recdata, null, null);//异步输出数据 } ns.BeginRead(client.buffer, 0, client.buffer.Length, new AsyncCallback(TCPCallBack), client); } else { //client.DisConnect(); //lstConn.Invoke(new MethodInvoker(delegate { // lstConn.Items.Remove(client); // /* // * TODO : 可以不让列表消失,变色或者加一个已断开的后缀 // * // * */ //})); //client = null; //GC.Collect();// 通知托管堆强制回收垃圾 //在这里要关闭client.NetWork.GetStream() ns.Close(); client.DisConnect(); lstConn.Invoke(new MethodInvoker(delegate { lstConn.Items.Remove(client); })); //lstClient.Remove(client); //BindLstClient(); client = null; GC.Collect();// 通知托管堆强制回收垃圾 if (tcpsever != null) { tcpsever.Stop(); Thread.Sleep(5000); StartTCPServer(); } } } else { client.DisConnect(); lstConn.Invoke(new MethodInvoker(delegate { lstConn.Items.Remove(client); })); //lstClient.Remove(client); //BindLstClient(); client = null; GC.Collect();// 通知托管堆强制回收垃圾 } } catch { } }