udpclient的广播代码

今天做了个简单的广播代码,发现一直不成功,弄了半个小时才发现是端口设置的不一致,看来,这个socket编程还是有点麻烦啊!

 public partial class broadca : Form
    {
        delegate void AppendStringCallback(string text);
        AppendStringCallback appendStringCallback;
        //使用的接收端口号
        private int port = 8001;
        private UdpClient udpClient;
     
        public broadca()
        {
            InitializeComponent();
            appendStringCallback = new AppendStringCallback(AppendString);
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            UdpClient myUdpClient = new UdpClient();
            try
            {
                //让其自动提供子网中的IP广播地址
               // IPAddress myIP = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);
               // IPEndPoint iep = new IPEndPoint(myIP, 8001);
           
                IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 8001);
                //允许发送和接收广播数据报
                myUdpClient.EnableBroadcast = true;
                //将发送内容转换为字节数组
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(textBox1.Text);
                //向子网发送信息
                myUdpClient.Send(bytes, bytes.Length, iep);
                textBox1.Clear();
                textBox1.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "发送失败");
            }
            finally
            {
                myUdpClient.Close();
            }
        }
        private void AppendString(string text)
        {
            if (richTextBox1.InvokeRequired == true)
            {
                this.Invoke(appendStringCallback, text);
            }
            else
            {
                richTextBox1.AppendText(text+"\r\n");
            }
        }
        //在后台运行的接收线程
        private void ReceiveData()
        {
            //在本机指定的端口接收
            udpClient = new UdpClient(port);
            IPEndPoint remote = null;
            //接收从远程主机发送过来的信息
            while (true)
            {
                try
                {
                    //关闭udpclient时此句会产生异常
                    byte[] bytes = udpClient.Receive(ref remote);
                    string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
                    AppendString(string.Format("来自于{0}: {1}", remote, str));

                }
                catch
                {
                  //推出循环,结束线程
                    break;
                }
            }
        }

        private void broadca_Load(object sender, EventArgs e)
        {
            richTextBox1.Text = "开始";
            Thread myThread = new Thread(new ThreadStart(ReceiveData));
            //将线程设为后台运行
            myThread.IsBackground = true;
            myThread.Start();
        }

        private void broadca_FormClosing(object sender, FormClosingEventArgs e)
        {
            udpClient.Close();
        }

    }

posted on 2008-04-01 17:21  小顾问  阅读(2225)  评论(0编辑  收藏  举报