• IP组播 MulticastChannel接口 DatagramChannel实现


    监听者

     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 }

    发送者

     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()+'
    ').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 }
  • 相关阅读:
    Python面向对象
    Python
    05、Win7上openSSH的安装与配置
    关于C++中的类型转换
    正确地使用智能指针
    为多态基类声明多态析构函数
    透视校正插值(Perspective-Correct Interpolation)
    保持const和non-const函数代码的一致
    第二章 信息的表示和处理
    《Linux内核分析》课程总结
  • 原文地址:https://www.cnblogs.com/WALLACE-S-BOOK/p/9734462.html
Copyright © 2020-2023  润新知