zoukankan      html  css  js  c++  java
  • C#局域网聊天工具_UDP广播

    接上一讲,程序启动就要发送广播消息,如何发送广播消息,这一讲将给大家好好讲讲网络广播的知识,以及C#如何实现广播. 
    第一部分.什么是广播地址,以及广播地址怎么计算 
    1.1 广播地址是什么? 
    主机号全为1,用于向一个网络内的所有主机发送信息的IP地址.如:受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。 
    PS:一般无特殊要求广播地址选择255.255.255.255即可. 
    1.2 计算方法 
    首先 计算网络地址 = IP地址  逻辑与(&)  子网掩码 
    先把IP,子网掩码转为2进制,然后进行逻辑与运算,得出网络地址 
    例: 
    IP 192.168.1.3  子网掩码 255.255.0.0 
    IP转二进制 11000000.10100100.00000001.00000011 
    子网掩码    11111111.11111111.00000000.00000000 
    与运算后    11000000.10100100.00000000.00000000 
    192.168.0.0这就是网络地址,其中子网掩码全1对应为网络号,全0对应的是主机号,即192.168.0.0对应的网络号为192.168,主机号为0.0.将网络地址主机部分全取反后得到的地址便是广播地址: 
    广播地址    11000000.10100100.11111111.11111111 
    换成10进制则为192.168.0.0

    第二部分.C#利用UDP协议如何实现广播 
    2.1  如何实现UDP广播,直接举例说明: 
    button1_Click时使用了UDP广播向外发送了数据 
    RecData()在后台接受UDP协议的消息

    //UDP通过广播实现群发功能 
    namespace BroadcastExample 

        public partial class Form1 : Form 
        { 
            delegate void AppendStringCallback(string text); 
            AppendStringCallback appendstringcallback; 
            //使用的接收端口 51008 
            /// <summary> 
            /// 端口号 
            /// </summary> 
            private int port = 51008; 
            /// <summary> 
            /// udp连接对象 
            /// </summary> 
            private UdpClient udpclient; 
            public Form1() 
            { 
                InitializeComponent(); 
                appendstringcallback = new AppendStringCallback(AppendString); 
            } 
            /// <summary> 
            /// 委托对象的处理过程 
            /// </summary> 
            /// <param name="text"> </param> 
            private void AppendString(string text) 
            { 
                if (richtextBox2.InvokeRequired == true) 
                { 
                    this.Invoke(appendstringcallback, text); 
                } 
                else 
                { 
                    richtextBox2.AppendText(text + " "); 
                } 
            } 
            /// <summary> 
            /// 在后台运行的接收线程 
            /// </summary> 
            private void RecData() 
            { 
                //本机指定端口接收 
                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 Form1_Load(object sender, EventArgs e) 
            { 
                //创建一个线程接收接收远程主机发来的信息 
                Thread mythread = new Thread(new ThreadStart(RecData)); 
                //将线程设为后台运行 
                mythread.IsBackground = true; 
                mythread.Start(); 
            } 
            private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
            { 
                udpclient.Close(); 
            } 
            private void button1_Click(object sender, EventArgs e) 
            { 
                UdpClient myUdpclient = new UdpClient(); 
                
                try 
                { 
                    IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, port); 
                    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(textBox1.Text); 
                    myUdpclient.Send(bytes, bytes.Length, iep); 
                    textBox1.Clear(); 
                    myUdpclient.Close(); 
                    textBox1.Focus(); 
                } 
                catch (Exception err) 
                { 
                    MessageBox.Show(err.Message, "发送失败"); 
                } 
                finally 
                { 
                    myUdpclient.Close(); 
                } 
            } 
        } 
    }

  • 相关阅读:
    java web开发小记(5)
    java web开发小记(4)
    java web开发小记(3)
    java web开发小记(2)
    java web开发小记(1)
    Myeclipse10小记
    jackson 转换 yyyy-MM-dd格式 少了一个小时问题解决(仅限中国)
    mysql,给每一条数据的某一个字段生成不同的随机数
    mybatis 表情存储报错问题解决
    spring cloud jackson 枚举json互转 枚举json序列化/反序列化
  • 原文地址:https://www.cnblogs.com/yuxuetaoxp/p/3914102.html
Copyright © 2011-2022 走看看