当使用Java的多播套接字我可以加入组播组,而无需使用此代码指定NetworkInterface
:加入使用DatagramChannel组播组,而无需指定网络接口
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.*
工厂
该解决方案是否可靠?任何人都可以解释为什么它有效,如果有更好的方法来实现我想要的?
哈瓦这里看看http://stackoverflow.com/questions/19392173/multicastsocket-constructors-and-binding-to-port-or-socketaddress – Shar1er80
那么明显'MulticastSocket.getNetworkInterface()'返回神奇的'0.0.0.0 NetworkInterface'你不能得到任何其他的方式。如果你调用了'MulticastSocket.setNetworkInterface()',它就不会这么做。很奇怪NIO版本没有单参数'join()'方法。 – EJP