发送端
package com.aaa.zubo;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Date;
public class ZuClass {
public static void main(String[] args) throws Exception {
//组播地址
InetAddress group = InetAddress.getByName("239.0.0.5");
//组播端口
int port = 19999;
MulticastSocket mss = null;
//创建一个套接字对象
mss = new MulticastSocket(port);
//使用组播套接字,加入到组播
mss.joinGroup(group);
// 开始按照一定的周期向加入到224.0.0.5的其他activemq服务器节点进行广播
Thread thread = Thread.currentThread();
while(!thread.isInterrupted()) {
//send方法
String message = new Date()+"我是一个activemq节点";
byte [] buffer2 = message.getBytes();
DatagramPacket dp = new DatagramPacket(buffer2, buffer2.length,group,port);
mss.send(dp);
System.out.println("发起组播: "+message);
synchronized (ZuClass.class) {
ZuClass.class.wait(5000);
}
}
mss.close();
}
}
接收端:
package com.aaa.zubo;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ZuRecive {
public static void main(String[] args) throws Exception {
MulticastSocket ms = new MulticastSocket(19999);
InetAddress ad = InetAddress.getByName("239.0.0.5");
ms.joinGroup(ad);
byte [] datas = new byte[2048];
DatagramPacket data = new DatagramPacket(datas, 2048,ad,19999);
Thread thread = Thread.currentThread();
System.out.println("开始接收组播消息....");
while(!thread.isInterrupted()) {
ms.receive(data);
int length = data.getLength();
System.out.println(new String(data.getData(),0,length,"UTF-8"));
}
ms.close();
}
}
可以启动多个接收端.
发送端和接收端的启动顺序无所谓.
关于组播:
在IP协议中,规定的D类IP地址为组播地址。224.0.0.0~239.255.255.255这个范围内的IP都是D类IP地址,其中有一些IP段是保留的有特殊含义的:
224.0.0.0~224.0.0.255:这个D类IP地址段为保留地址,不建议您在开发过程中使用,因为可能产生冲突。例如224.0.0.5这个组播地址专供OSPF协议(是一种路由策略协议,用于找到最优路径)使用的组播地址;224.0.0.18这个组播地址专供VRRP协议使用(VRRP协议是虚拟路由器冗余协议)。
224.0.1.0~224.0.1.255:这个D类IP地址为公用组播地址,用于在整个Internet网络上进行组播。除非您有*DNS的控制/改写权限,否则不建议在局域网内使用这个组播地址断。
239.0.0.0~239.255.255.255:这个D类IP地址段为推荐在局域网内使用的组播地址段。注意,如果要在局域网内使用组播功能,需要局域网中的交换机/路由器支持组播功能。幸运的是,目前市面上只要不是太过低端的交换机/路由器,都支持组播功能(组播功能所使用的主要协议为IGMP协议,关于IGMP协议的细节就不再进行深入了)。