java 中多播、广播编程

在 IP 协议层,有多播、广播的概念。IP 地址分为网络地址和主机地址,主机地址全部为1,就是广播地址。多播使用 D 类地址,从 224.0.0.0 到 239.255.255.255。IP 多播需要 IGMP 的支持,大致是,需要接收多播的主机先向路由器进行注册,然后路由器在收到多播包后会转发给注册的主机。

 java 语言实现多播、广播要用到 MulticastSocket,DatagramSocket。

 

多播发送:

package com.zhang;

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

public class Multicast_Send {
    public static void main(String[] args) {
        String[] message = { "hello", "hi" };
        int port = 1234; // 端口
        InetAddress group = null; // 地址
        MulticastSocket multicastSocket = null; // 组播套接字

        try {
            group = InetAddress.getByName("239.1.1.1"); // 设置多播地址
            multicastSocket = new MulticastSocket(port); 
            // 设置数据包的ttl,值从0到255,应该是和ip包的ttl字段对应上了
            // 之前设置为1,在无限局域网中,数据包无法到达其他主机,所以这里设为2
            // 如果设为0,则只能发送给本机
            multicastSocket.setTimeToLive(2); 
            multicastSocket.joinGroup(group);
        } catch (Exception e) {
            e.printStackTrace();
        }

        while (true) {
            try {
                DatagramPacket packet = null;
                for (String msg : message) // 循环发送每条广播信息
                {
                    msg = msg + "," + System.currentTimeMillis();
                    byte buff[] = msg.getBytes();
                    packet = new DatagramPacket(buff, buff.length, group, port);
                    multicastSocket.send(packet);
                    System.out.println("send:" + msg);
                    Thread.sleep(2000);
                }
            } catch (Exception e) {
                System.out.println("Error:" + e);
            }
        }
        
    }
}

 

多播接收:

package com.zhang;

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

public class Multicast_Recv {
    public static void main(String[] args) throws Exception {
        InetAddress group = InetAddress.getByName("239.1.1.1");
        int port = 1234;
        MulticastSocket socket = new MulticastSocket(port);
        socket.joinGroup(group);

        while (true) {
            byte buff[] = new byte[8192];
            DatagramPacket packet = null;
            packet = new DatagramPacket(buff, buff.length, group, port);
            socket.receive(packet);
            String message = new String(packet.getData(), 0, packet.getLength());
            System.out.println("receive:" + message);
        }
    }
}

 

广播发送:

package com.zhang;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Broadcast_Send {
    public static void main(String[] args) {
        // 本机ip:10.3.80.248, 子网掩码:255.255.255.0,推出广播地址:10.3.80.255
        String host = "10.3.80.255"; // 广播地址
        int port = 9999; // 广播的目的端口
        String message = null; // 用于发送的字符串
        try {
            while (true) {
                message = "hello world " + System.currentTimeMillis();
                InetAddress addr = InetAddress.getByName(host);
                DatagramSocket ds = new DatagramSocket();
                DatagramPacket dp = new DatagramPacket(message.getBytes(),
                        message.length(), addr, port);
                ds.send(dp);
                Thread.sleep(2000);
//                ds.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

广播接收:

package com.zhang;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Broadcast_Recv {
    public static void main(String[] args) {
        int port = 9999; // 开启监听的端口
        DatagramSocket ds = null;
        DatagramPacket dp = null;
        byte[] buf = new byte[1024];// 存储发来的消息
        try {
            // 绑定端口
            ds = new DatagramSocket(port);
            dp = new DatagramPacket(buf, buf.length);
            System.out.println("监听广播端口打开:");
            
            while (true) {
                ds.receive(dp);
                System.out.println("收到广播消息:" + new String(buf));
            }
            
//            ds.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

转载于:https://www.cnblogs.com/allenwas3/p/8882204.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值