使用Java的多播套接字时,可以使用以下代码在不指定NetworkInterface的情况下加入多播组:

MulticastSocket sock = new MulticastSocket(PORT);
sock.joinGroup(ADDR);


另一方面,如果我想使用NIO,可以执行以下操作:

DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
        .setOption(StandardSocketOptions.SO_REUSEADDR, true)
        .bind(new InetSocketAddress(PORT))
        .setOption(StandardSocketOptions.IP_MULTICAST_IF, IFC);

dc.join(ADDR, IFC);


其中IFC是我感兴趣的NetworkInterface
如果我事先不知道网络接口,该如何加入MulticastSocket?之类的组

我发现的一种解决方案是使用以下代码:

MulticastSocket msock = new MulticastSocket();
NetworkInterface ifc = msock.getNetworkInterface();
msock.close();
DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
        .setOption(StandardSocketOptions.SO_REUSEADDR, true)
        .bind(new InetSocketAddress(PORT))
        .setOption(StandardSocketOptions.IP_MULTICAST_IF, ifc);

dc.join(ADDR, ifc);


令人惊讶的是,当查看MulticastSocket.getNetworkInterface()方法返回的NetworkInterface时,此代码按预期方式工作并执行,因此我看到它返回了一个名为“ 0.0.0.0”的接口,该接口当然不存在。而且,没有办法与任何NetworkInterface.*工厂获得此网络接口

解决方案可靠吗?谁能解释它为什么起作用以及是否有更好的方法实现我想要的?

最佳答案

我使用本地地址可以找到局域网设备!所以你可以试试看!
例如
NetworkInterface IFC = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());

10-08 19:31