監聽者java
1 import java.io.IOException; 2 import java.net.InetAddress; 3 import java.net.InetSocketAddress; 4 import java.net.NetworkInterface; 5 import java.net.StandardProtocolFamily; 6 import java.net.StandardSocketOptions; 7 import java.nio.ByteBuffer; 8 import java.nio.channels.Channels; 9 import java.nio.channels.DatagramChannel; 10 import java.nio.channels.MulticastChannel; 11 import java.nio.channels.WritableByteChannel; 12 import java.util.Enumeration; 13
14 public class MulticastSniffer { 15
16 public static void main(String[] args) throws IOException { 17 //NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
18 NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getByName("192.168.1.181")); 19 //設置本地硬件端口;
20
21 InetSocketAddress group = new InetSocketAddress(InetAddress.getByName("224.0.0.1"), 2000); 22 //設置組播地址
23 DatagramChannel channel = DatagramChannel.open(StandardProtocolFamily.INET) 24 .setOption(StandardSocketOptions.SO_REUSEADDR, true) 25 .setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false) 26 .bind(group) 27 .setOption(StandardSocketOptions.IP_MULTICAST_IF, interf); 28
29 channel.configureBlocking(true); 30
31 try(MulticastChannel multicast = channel){ 32 multicast.join(group.getAddress(), interf); 33
34 byte[] data = new byte[8192]; 35 ByteBuffer buffer = ByteBuffer.allocate(8192); 36 WritableByteChannel out = Channels.newChannel(System.out); 37 while((((DatagramChannel)multicast).receive(buffer))!= null) { 38 buffer.flip(); 39 out.write(buffer); 40 buffer.clear(); 41 } 42
43 }catch(IOException e) { 44 e.printStackTrace(); 45 } 46
47 } 48
49 }
發送者spa
1 import java.io.IOException; 2 import java.net.InetAddress; 3 import java.net.InetSocketAddress; 4 import java.net.NetworkInterface; 5 import java.net.StandardProtocolFamily; 6 import java.net.StandardSocketOptions; 7 import java.nio.ByteBuffer; 8 import java.nio.channels.DatagramChannel; 9 import java.nio.channels.MulticastChannel; 10
11 public class MulticastSender { 12
13 public static void main(String[] args) throws IOException { 14
15 // NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
16
17 NetworkInterface interf = NetworkInterface.getByInetAddress(InetAddress.getByName("192.168.1.181")); 18 //設置本地硬件端口;
19
20 InetSocketAddress group = new InetSocketAddress(InetAddress.getByName("224.0.0.1"), 2000); 21 //設置組播地址
22 DatagramChannel channel = DatagramChannel.open(StandardProtocolFamily.INET) 23 .setOption(StandardSocketOptions.SO_REUSEADDR, true) 24 .bind(group) 25 .setOption(StandardSocketOptions.IP_MULTICAST_IF, interf); 26
27 //.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false)
28 channel.configureBlocking(true); 29
30 try(MulticastChannel multicast = channel){ 31 multicast.join(group.getAddress(), interf); 32
33 ByteBuffer buffer = ByteBuffer.allocate(8192); 34 buffer.put((InetAddress.getLocalHost().toString()+'\n').getBytes()); 35 for(int i=0; i<3; i++) { 36 buffer.flip(); 37 ((DatagramChannel)multicast).send(buffer, group); 38 } 39
40 }catch(IOException e) { 41 e.printStackTrace(); 42 } 43
44 } 45
46 }