UDP的单播组播与广播

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、基于IP的传输层协议,它提供了简单的、不可靠的数据报服务。UDP支持三种主要的通信方式:单播、组播和广播。

1. UDP 单播(Unicast)

单播是指数据从一个发送者发送到一个特定的接收者。这是最常见的网络通信方式。
特点
一对一:数据包从一个源地址发送到一个目标地址。
简单高效:UDP本身不提供可靠性机制,因此传输速度快,延迟低。
适用场景:适用于客户端与服务器之间的通信,例如网页浏览、文件传输等。
优点
低延迟:由于UDP是无连接的,没有TCP的三次握手和确认机制,因此延迟较低。
资源占用少:UDP不需要维护连接状态,因此对系统资源的占用较少。
缺点
不可靠:UDP不保证数据包的顺序、完整性或可靠性。数据包可能会丢失、重复或乱序到达。
需要应用层支持:如果需要可靠性,需要在应用层实现额外的机制,例如重传、确认等。

2. UDP 组播(Multicast)

组播是一种一对多或多对多的通信方式,允许一个发送者将数据发送到多个接收者,而无需单独发送每个数据包。
特点
一对多或多对多:数据从一个源地址发送到多个目标地址,这些目标地址属于同一个组播组。
高效利用带宽:发送者只需发送一次数据,网络设备会负责将数据复制并转发到所有组成员,大大减少了网络带宽的占用。
适用场景:适用于大规模的多点通信场景,例如视频会议、在线直播、分布式系统中的消息广播等。
优点
高效:减少了重复发送的开销,节省了网络带宽。
可扩展性:适用于大规模的多点通信,支持大量接收者。
灵活性:组播组可以动态加入或离开,灵活性高。
缺点
网络设备要求:需要网络设备(如路由器、交换机)支持组播协议(如IGMP、PIM等),否则数据无法正确转发。
不可靠性:UDP本身不保证数据的可靠性,组播数据也可能会丢失或乱序到达。
配置复杂:需要配置组播地址和组播组,管理相对复杂。

3. UDP 广播(Broadcast)

广播是一种将数据发送到网络中所有主机的方式,通常用于局域网内的通信。
特点
一对多:数据从一个源地址发送到网络中的所有主机。
范围有限:广播通常仅限于局域网内,无法跨网络边界传播。
适用场景:适用于局域网内的服务发现、设备发现或消息通知,例如DHCP客户端请求IP地址、ARP请求等。
优点
简单易用:实现起来相对简单,不需要复杂的组管理机制。
快速发现:适用于在局域网内快速发现服务或设备,例如打印机、文件服务器等。
缺点
效率较低:广播会将数据发送到网络中的所有主机,即使有些主机并不需要这些数据,可能会浪费带宽。
安全风险:广播数据对所有主机可见,容易被监听或攻击。
范围限制:广播数据无法跨网络边界传播,只能在局域网内使用。

总结

特性/方式单播组播广播
数据流向一对一一对多或多对多一对多
效率高(点对点)高(网络设备复制)低(发送到所有主机)
可靠性不可靠(UDP)不可靠(UDP)不可靠(UDP)
适用场景客户端与服务器通信视频会议、在线直播局域网内服务发现
网络要求无特殊要求需要组播支持无特殊要求
安全性较高(目标明确)需要额外安全措施较低(数据对所有主机可见)

receive.java

package Udpdemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Receivedemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象
        DatagramSocket ds = new DatagramSocket(10086);
        //2.接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);

        while (true) {
            ds.receive(dp);
            //3.解析数据
            byte[] data = dp.getData();
            int len = dp.getLength();
            String ip = dp.getAddress().getHostAddress();
            String name = dp.getAddress().getHostName();

            //4.打印数据
            System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送的数据为:" + new String(data,0,len));
        }
    }
}

** send.java**

package Udpdemo;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class Sentdemo {
    public static void main(String[] args) throws IOException {
        /* 实现程序
        UDP发送:数据来自键盘录入,直到输入的数据是886,发送数据结束
        UDP接收:接收数据,并把接收到的数据在控制台输出,死循环输入
         */
        //1.创建DatagramSocket对象
        DatagramSocket ds = new DatagramSocket();
        //2.打包数据
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入想说的话:");
            String str = sc.nextLine();
            if ("886".equals(str)) {
                break;
            }
            byte[] bytes = str.getBytes();

            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
            //3.发送数据
            ds.send(dp);
        }
        //4.释放资源
        ds.close();
    }
}

输入

在这里插入图片描述

输出

在这里插入图片描述

为send创建多个实例即可实现共同聊天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值