Example #1
0
        /// <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);
            }
        }
Example #2
0
        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 { }
            }
        }
Example #3
0
 /// <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);
     }
 }
Example #4
0
 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;
     }
 }
Example #5
0
        /// <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 { }
        }