using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;namespace Chart
{
    public partial class FrmFirst : Form
    {
        
        //用于存储用户IP等信息
        List<string[]> users = new List<string[]>();        public FrmFirst()
        {
            InitializeComponent();
        }        //本机hostname
        private string myName;        public string MyName
        {
            get
            {
                return Dns.GetHostName();
            }        }        //IP
        private string myIP;        public string MyIP
        {
            get
            {
                IPAddress[] ip = Dns.GetHostAddresses(MyName);
                return ip[0].ToString();
            }
        }
        /// <summary>
        /// 鼠标双击节点的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            FrmSecond frm_sec = new FrmSecond();
            frm_sec.Show();
        }       
        
        /// <summary>
        /// 上下线端口:8888
        /// ps:发送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmFirst_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            Thread sendOnlineThead = new Thread(new ThreadStart(ImOnline));
            Thread acceptThead = new Thread(new ThreadStart(AcceptFromMessage));
            //Thread addnodeThead = new Thread(new ThreadStart(AddNodes));
            acceptThead.Start();
            sendOnlineThead.Start();
            //addnodeThead.Start();
        }
        /// <summary>
        /// 主窗体打开的时候
        /// 调用此方法
        /// 发送广播
        /// 传递"我在线"这个信息
        /// </summary>
        private void ImOnline()
        {
            //IPEndPoint ipServer = new IPEndPoint(IPAddress.Parse(MyIP), 8888
            UdpClient client = new UdpClient(MyIP.Substring(0, MyIP.LastIndexOf('.') + 1) + "255", 8888);
            byte[] bt = Encoding.Default.GetBytes(MyIP + "|" + MyName);
            client.Send(bt, bt.Length);
        }
        
        /// <summary>
        ///上下线端口:8888
        ///ps:监听
        ///如果在集合中找到
        ///退出循环
        ///找不到的话
        ///在自己TreeView列表里添加
        ///并发送给对方信息
        /// </summary>
        private void AcceptFromMessage()
        {
            string[] str;
            IPEndPoint ipServer = new IPEndPoint(IPAddress.Parse(MyIP), 8888);
            UdpClient server = new UdpClient(ipServer);
             
            while (true)
            {
                byte[] bt = server.Receive(ref ipServer);
                string readLineDataFromClient = Encoding.Default.GetString(bt);
                str=readLineDataFromClient.Split('|');
                foreach (var t in users)
                {
                    bool b = false;
                    if (t[0].Equals(str[0]))      
                    {
                        b = true;
                    }                    if(!b)
                    {
                        users.Add(str);
                        UdpClient SendInfo = new UdpClient(str[0], 8888);
                        byte[] bit = Encoding.Default.GetBytes(MyIP + "|" + MyName);
                        SendInfo.Send(bit, bit.Length);
                    }
                }
                
                //Thread.Sleep(5000);
                treeView1.Nodes.Clear();
                
                // users.Add(str);
                 //this.textBox1.Text=string.Format("接受到数据:[{0}]", readLineDataFromClient);
            }
           
            foreach (var t in users)
            {
                TreeNode tn = new TreeNode(t[0] + "(" + t[1] + ")");
                tn.Name = t[0];
                treeView1.Nodes.Add(tn);
            }        
        }        //public void AddNodes()
        //{
            
        //}        //private void button4_Click(object sender, EventArgs e)
        //{
        //    AddNodes();
        //}     }    
}