监听者
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.StandardProtocolFamily;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.DatagramChannel;
import java.nio.channels.MulticastChannel;
import java.nio.channels.WritableByteChannel;
import java.util.Enumeration;
public class MulticastSniffer {
public static void main(String[] args) throws IOException {
//NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getByName("192.168.1.181"));
//设置本地硬件端口;
InetSocketAddress group = new InetSocketAddress(InetAddress.getByName("224.0.0.1"), 2000);
//设置组播地址
DatagramChannel channel = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false)
.bind(group)
.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf);
channel.configureBlocking(true);
try(MulticastChannel multicast = channel){
multicast.join(group.getAddress(), interf);
byte[] data = new byte[8192];
ByteBuffer buffer = ByteBuffer.allocate(8192);
WritableByteChannel out = Channels.newChannel(System.out);
while((((DatagramChannel)multicast).receive(buffer))!= null) {
buffer.flip();
out.write(buffer);
buffer.clear();
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
发送者
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.StandardProtocolFamily;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.MulticastChannel;
public class MulticastSender {
public static void main(String[] args) throws IOException {
// NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getByName("192.168.1.181"));
//设置本地硬件端口;
InetSocketAddress group = new InetSocketAddress(InetAddress.getByName("224.0.0.1"), 2000);
//设置组播地址
DatagramChannel channel = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(group)
.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf);
//.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false)
channel.configureBlocking(true);
try(MulticastChannel multicast = channel){
multicast.join(group.getAddress(), interf);
ByteBuffer buffer = ByteBuffer.allocate(8192);
buffer.put((InetAddress.getLocalHost().toString()+'\n').getBytes());
for(int i=0; i<3; i++) {
buffer.flip();
((DatagramChannel)multicast).send(buffer, group);
}
}catch(IOException e) {
e.printStackTrace();
}
}
}