當使用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