【Java】单播、组播、广播

一、介绍

UDP在通信的时候有三种方式,分别是 单播、组播、广播

单播:一对一,左边的发送端只给右边的一台电脑发送数据。

image-20240508130051893

组播:顾名思义,可以给一组电脑发送信息。

左边还是发送端,但是右边的接收端可以是一组。

image-20240508130131197

广播:左边的发送端,可以给局域网中所有的电脑发送数据。

image-20240508130241644

那么这三种方式代码该怎么写呢?

单播很简单,我们之前写的所有的代码都是单播形式。因为我们之前写的代码就是一对一的形式。


二、组播

组播地址,范围是 224.0.0.0 ~ 239.255.255.255,其中如果我们自己想用,只能用 224.0.0.0 ~ 224.0.0.255 范围内的,因为这个范围是给我们预留的组播地址。

那这个组播地址和之前的IP有什么不一样呢?

之前的IP只能表示一台电脑,而这里随便一个组播地址,就可以表示多台电脑。

组播代码其实也是跟之前一模一样的。

1)发送端代码

在创建对象的时候,之前单播创建的是 DatagramSocket,但是现在是组播,因此我们需要创建 MulticastSocket 这个类的对象才行。

其他的都是一样的,只不过在发送数据指定IP的时候,需要指定组播地址。

public static void main(String[] args) throws IOException {
    //创建MulticastSocket对象
    MulticastSocket ms = new MulticastSocket();

    // 创建DatagramPacket对象
    String s = "你好,你好!";
    byte[] bytes = s.getBytes();
    InetAddress address = InetAddress.getByName("224.0.0.1");
    int port = 10000;

    DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);

    // 调用MulticastSocket发送数据方法发送数据
    ms.send(datagramPacket);

    // 释放资源
    ms.close();
}

2)接收端代码

接收端同样也是创建 MulticastSocket 对象,但是在下面接收端多了一步:将当前本机,添加到 224.0.0.1 的这一组当中。

下面一共写了三个接收端。当我们先运行接收端,再来运行发送端发送数据的时候你会发现,这里的三个接收端都可以接收到数据。

public class ReceiveMessageDemo1 {
    public static void main(String[] args) throws IOException {
        //1. 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket(10000);

        //2. 将将当前本机,添加到224.0.0.1的这一组当中
        InetAddress address = InetAddress.getByName("224.0.0.1");
        ms.joinGroup(address);

        //3. 创建DatagramPacket数据包对象
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        //4. 接收数据
        ms.receive(dp);

        //5. 解析数据
        byte[] data = dp.getData();
        int len = dp.getLength();
        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();

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

        //6. 释放资源
        ms.close();
    }
}

---------------------
    
public class ReceiveMessageDemo2 {
    public static void main(String[] args) throws IOException {
        //1. 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket(10000);

        //2. 将将当前本机,添加到224.0.0.1的这一组当中
        InetAddress address = InetAddress.getByName("224.0.0.1");
        ms.joinGroup(address);

        //3. 创建DatagramPacket数据包对象
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        //4. 接收数据
        ms.receive(dp);

        //5. 解析数据
        byte[] data = dp.getData();
        int len = dp.getLength();
        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();

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

        //6. 释放资源
        ms.close();
    }
}

---------------------------
    
public class ReceiveMessageDemo3 {
    public static void main(String[] args) throws IOException {
        //1. 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket(10000);

        //2. 将将当前本机,添加到224.0.0.2的这一组当中
        InetAddress address = InetAddress.getByName("224.0.0.1");
        ms.joinGroup(address);

        //3. 创建DatagramPacket数据包对象
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        //4. 接收数据
        ms.receive(dp);

        //5. 解析数据
        byte[] data = dp.getData();
        int len = dp.getLength();
        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();

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

        //6. 释放资源
        ms.close();
    }
}

三、广播

如果我们发送信息的时候,发到的是 255.255.255.255 上,此时局域网中所有的电脑都可以接收到你的信息,这就是广播。

广播其实是最简单的,代码几乎跟单播是一模一样的,我们只要把单播的地址改成 255.255.255.255 即可。

此时在发送的时候,就可以给局域网里面所有的电脑都去发生数据了。

//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("255.255.255.255");
    int port = 10086;
    DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
    //3.发送数据
    ds.send(dp);
}

//4.释放资源
ds.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值