java与网络(IPv4组播)

该博客展示了如何使用Java进行组播数据包的接收和发送。`MulticastReceiver`类用于接收组播包,它创建一个MulticastSocket,加入指定组播地址并持续接收数据。`MulticastSender`类则用于发送组播包,设置组播地址、端口和TTL,并指定发送接口,循环发送数据包。

1. 接收组播包

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

public class MulticastReceiver {

	public static void main(String[] args) {
		InetAddress group = null;
		int port = 0;

		try {
			group = InetAddress.getByName(args[0]);
			port = Integer.parseInt(args[1]);
		} catch (Exception e) {
			System.err.println("Usage: multicast_address port");
			System.exit(1);
		}

		MulticastSocket ms = null;
		try {
			ms = new MulticastSocket(port);
			ms.joinGroup(group);

			System.out.println("waiting for multicast test data");

			byte[] buffer = new byte[8192];
			while (true) {
				DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
				ms.receive(dp);
				String str = new String(dp.getData(), "UTF-8");
				System.out.println(str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ms != null) {
				try {
					ms.leaveGroup(group);
					ms.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

2. 发送组播包

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

public class MulticastSender {

	public static void main(String[] args) {
		InetAddress addr = null;
		int port = 0;
		byte ttl = (byte) 1;

		try {
			addr = InetAddress.getByName(args[0]);
			port = Integer.parseInt(args[1]);
			if (args.length > 2) {
				ttl = (byte) Integer.parseInt(args[2]);
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Usage: multicast_address port ttl");
			System.exit(1);
		}

		byte[] data = "Here's some multicast test data\r\n".getBytes();
		DatagramPacket dp = new DatagramPacket(data, data.length, addr, port);

		//指定组播流输出的接口
		InetAddress eth = null;
		try {
			eth = InetAddress.getByName("192.168.1.102"); //接口上的IP
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

		try (MulticastSocket ms = new MulticastSocket()) {
			ms.setInterface(eth);
			ms.setTimeToLive(ttl);
			ms.joinGroup(addr);
			for (int i = 1; i < 100; i++) {
				ms.send(dp);
			}
			System.out.println("Multicast test data sending complete.");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值