组播地址和组
组播–介于点对点传播和广播之间。
组播地址(multicast address)是称为组播组(multicast group)的一组主机共享地址。
组播组是一组共享一个组播地址的主机。任何发送给该组播地址的数据都会中继给组中所有成员。
MulticastSocket
public class MulticastSocket extends DatagramSocket
package ch13;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
public class MulticastSniffer {
public static void main(String[] args) {
InetAddress group = null;
int port = 0;
try {
group = InetAddress.getByName(args[0]);
port = Integer.parseInt(args[1]);
}catch(ArrayIndexOutOfBoundsException | NumberFormatException | UnknownHostException ex) {
System.err.println("Usage: java MulticastSniffer multicast_address port");
System.exit(1);
}
MulticastSocket ms = null;
try {
//新建绑定到指定端口的组播Socket,如果已经被占用,抛出异常。
//可以是端口、SocketAddress,以及空
ms = new MulticastSocket(port);
//加入组播。加入后才能接受组播的信息。进入前也可以向组播发送信息。
ms.joinGroup(group);
byte[] buffer = new byte[8192];
//接受和发送,和DatagramSocket一致
while(true) {
//新建数据报,
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
ms.receive(dp);
String s = new String(dp.getData(),"8859_1");
System.out.println(s);
}
}catch(IOException ex) {
System.err.println(ex);
}finally {
if(ms!=null) {
try {
//脱离组播
ms.leaveGroup(group);
ms.close();
}catch(IOException ex) {
}
}
}
}
}
package ch13;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
public class MulticastSender {
public static void main(String[] args) {
InetAddress ia = null;
int port = 0;
byte ttl = (byte)1;
try {
ia = InetAddress.getByName(args[0]);
port = Integer.parseInt(args[1]);
if(args.length>2) ttl = (byte) Integer.parseInt(args[2]);
}catch(NumberFormatException|IndexOutOfBoundsException|UnknownHostException ex) {
System.err.println(ex);
System.err.println("Usage: java MulticastSender multicast_address port ttl");
System.exit(1);
}
byte[] data ="Here's some multicast data\r\n".getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, ia, port);
try(MulticastSocket ms = new MulticastSocket()) {
//设置继承于基类的send方法。能传播的路由器数
//send(Datagrampacket dp, byte ttl)该类自带方法。
ms.setTimeToLive( ttl);
ms.joinGroup(ia);
for(int i=0; i<10; i++) {
ms.send(dp);
}
ms.leaveGroup(ia);
}catch(SocketException ex) {
System.err.println(ex);
}catch(IOException ex) {
System.err.println(ex);
}
}
}
回送
一台主机是否接受他自己发送的组播包。
public void setLoopbackMode(true)//表示不希望回送。