udp udpClient 聊天室

发布于:2024-06-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

简介

1、UDP(User Data Protocol,用户数据报协议)
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。


udpClient服务器

搭建服务器界面

打开
UdpClient udp;
// 打开
private void button1_Click(object sender, EventArgs e)
{
    // 1 创建udp对戏那个 指定ip地址和端口号
    udp = new UdpClient(new IPEndPoint(IPAddress.Any, 8080));

    // 2 接收数据
    startReceive();
}
接收数据方法
private void startReceive()
{
    new Thread(() =>
    {
        try
        {
            while (true)
            {
                // 创建一个ip接收客户端的ip地址
                IPEndPoint ip = null;
                byte[] body = udp.Receive(ref ip);
                string s = Encoding.UTF8.GetString(body);
                BeginInvoke((Action)(() =>
                {
                    richTextBox1.AppendText(ip.ToString() + ":" + s + "\t\n");
                }));
            }
        }
        catch 
        {

        }
    }).Start();
}
关闭
private void button2_Click(object sender, EventArgs e)
{
    udp.Close();
    udp = null;
}

private void button3_Click(object sender, EventArgs e)
{
    byte[] bs = Encoding.UTF8.GetBytes(this.textBox1.Text);
    // 发数据
    // 参数1 字节数组
    // 参数2 字节长度
    // 参数3 目标主机地址
    // 参数4 端口号
    udp.Send(bs,bs.Length,"192.168.107.60",8080);
}

udpClient组播

客户端

打开服务器
UdpClient udp;
// 打开服务器
private void button3_Click(object sender, EventArgs e)
{
    udp = new UdpClient(new IPEndPoint(IPAddress.Any,8080 ));
    strarReceive();
    Console.WriteLine("222222");


}
异步的方式

        1 new Thread() 分界线
        2 Task.Run() 异步任务
        3 async(异步) 和 await(等待)

async void strarReceive()
{
    while (true)
    {
        // await 跟一个异步任务
        // 等待异步任务结束之后 再去执行
        // 
        UdpReceiveResult body = await udp.ReceiveAsync();
        // body.RemoteEndPoint 远程终端
        // body.Buffer 数据字节数组
        BeginInvoke((Action)(() =>
        {
            richTextBox1.AppendText(body.RemoteEndPoint.ToString()+":"+Encoding.UTF8.GetString(body.Buffer)+"\t\n");

            this.richTextBox1.ScrollToCaret();
        }));

    }
}
加入组播地址
 private void button1_Click(object sender, EventArgs e)
 {
     // Join 加入
     // 
     udp.JoinMulticastGroup(IPAddress.Parse(this.textBox1.Text)); // 加入组播地址
 }
发送消息
private void button2_Click_1(object sender, EventArgs e)
{
    // 发送消息
    byte[] bs = Encoding.UTF8.GetBytes(this.textBox2.Text);
    udp.Send(bs, bs.Length, this.textBox1.Text, 8080);
}

效果如下