Java MulticastSocket 广播数据报


MulticastSocket 广播数据报

  • 这种通信类似于收音机的广播,用户只要调到指定的频道上就能收听到广播的内容。要想实现这个功能,需要使用特殊的 IP 地址。要想实现多播或广播通信的主机都必须加入同一个 D 类地址中。D 类地址的十进制表示范围是 224.0.0.0~239.255.255.255;
  • 要实现广播,需要使用 MulticastSocket 类。该类是一种基于 UDP 的 DatagramSocket,用于发送和接收 IP 多播包。该类的对象可以加入 Internet 上其他多播主机的“组”中。类 DatagramSocket 的常用方法如下:
    (1)MulticastSocket(int port) throws IOException:创建一个多播套接字,并将其绑定到指定端口上;
    (2)MulticastSocket(SocketAddress bindaddr) throws IOException:创建一个多播套接字,并将其绑定到一个指定套接字地址上;
    (3)public void joinGroup(InetAddress mcastaddr) throws IOException:将多播套接字加入指定多播组;
    (4)public void leaveGroup(InetAddress mcastaddr) throws IOException:将多播套接字移出多播组;
    (5)public void setTimeToLive(int ttl) throws IOException:设置在此 MulticastSocket 上发出的多播数据包的默认生存时间;
  • java.net.MulticastSocket,详见:Class MulticastSocket
  • ttl 参数设置数据包最多可以跨过多少个网络:
    • 当 ttl 为 0 时,数据包应停留在本地主机;
    • 当 ttl 为 1 时,数据包应发送到本地局域网;
    • 当 ttl 为 32 时,数据包应发送到本站点的网络上;
    • 当 ttl 为 64 时,数据包应保留在本地区;
    • 当 ttl 为 128 时,数据包应保留在本大洲;
    • 当 ttl 为 255 时,数据包可以发送到所有地方;

1. 应用:广播数据报

a. 发送端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

class BroadCast {
    public void send() {
        String msg = "Hello,This is Broadcast Message"; // 多播的内容
        int port = 6666; // 多播端口号
        InetAddress group = null;
        MulticastSocket ms = null;
        try {
            group = InetAddress.getByName("224.1.1.1"); // 创建多播地址
            ms = new MulticastSocket(port); // 创建多播套接字
            ms.joinGroup(group); // 将套接字加入多播地址
            ms.setTimeToLive(1); // 设置数据报发送范围为本地
            DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.length(), group, port);
            // 创建待发送的数据报
            ms.send(dp); // 发送数据报
        } catch (IOException e) {
            System.out.println(e);
        } finally {
            ms.close(); // 关闭套接字
        }}}
public class BroadcastTest {
    public static void main(String[] args) {
        new BroadCast().send();
    }
}

b. 接收端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

class Receiver {
    public void receive() {
        byte[] data = new byte[1024]; // 数据缓存区
        int port = 6666; // 多播端口号
        InetAddress group = null;
        MulticastSocket ms = null;
        try {
            group = InetAddress.getByName("224.1.1.1"); // 创建多播地址
            ms = new MulticastSocket(port); // 创建多播套接字
            ms.joinGroup(group); // 将套接字加入多播地址
            DatagramPacket dp = new DatagramPacket(data, data.length, group, port);
            // 创建待接收的数据报
            ms.receive(dp); // 接收数据报
            String msg = new String(dp.getData(), 0, dp.getLength());
            System.out.println("接收的广播数据为:" + msg);
        } catch (IOException e) {
            System.out.println(e);
        } finally {
            ms.close(); // 关闭套接字
        }
    }
}

public class ReceiverTest {
    public static void main(String[] args) {
        new Receiver().receive();
    }
}

c. 运行演示

  • 先运行接收端,再运行广播端,广播端发送消息,客户端收到该消息后将其显示出来:
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值