2017-01-25 52 views
1

我有一個組播套接字,必須指定一個網絡接口才能接收數據。但是,當我使用網絡接口加入組時,Java將不會收到它。我有一個簡單的Python程序,可以在同一臺服務器上完成同樣的事情,並且工作正常。未在特定網絡接口上接收的Java組播套接字

我在爲Java中的MulticastSocket設置NetworkInterface時缺少什麼?

的是java:

SocketAddress socketAddress = new InetSocketAddress("x.x.x.x", 40000); 
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(InetAddress.getByName("z.z.z.z")); 

    logger.info("Network interface is {} ", networkInterface); 

    MulticastSocket s = new MulticastSocket(); 
    s.setInterface(InetAddress.getByName("z.z.z.z")); 
    s.joinGroup(socketAddress,networkInterface); 
    logger.info(s.getNetworkInterface()); 

while(true){ 

      try{ 

       logger.info("Waiting for message"); 
       byte[] size = new byte[2]; 

       DatagramPacket recv = new DatagramPacket(size, size.length); 
       socket.receive(recv); 

       logger.info("Received size message"); //Never get here 
       ByteBuffer wrapped = ByteBuffer.wrap(size); // big-endian by default 
       short messageSize = wrapped.getShort(); 

       byte[] buf = new byte[messageSize-2]; 
       DatagramPacket message = new DatagramPacket(buf, buf.length); 
       socket.receive(message); 

       logger.info("Received multicast message"); 
       dataQueue.put(buf); 
      }catch(Exception e){ 
       logger.error("Failed to receive multicast message ",e); 
      } 
     } 

這樣做的結果是,我從來沒有收到任何數據包。我有一個簡單的python程序,它可以完成相同的任務,並且每次都能很好地工作。

僅供參考蟒蛇看起來像開關這一個MulticastChannel

MCAST_GRP = 'x.x.x.x' 
MCAST_PORT = 40000 

mcastsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
mcastsock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
mcastsock.setsockopt(socket.SOL_IP,socket.IP_ADD_MEMBERSHIP, 
       socket.inet_aton(MCAST_GRP)+socket.inet_aton('z.z.z.z')) 
mcastsock.bind((MCAST_GRP,MCAST_PORT)) 

while True: 
    print mcastsock.recv(1320) 
+0

在上面的Python腳本,而不是「z.z.z.z」什麼,我需要提供哪些資料? – kit

回答

1

使用解決了問題的NIO包。不完全確定它是原因,但底層接口是igmp v3,在某些情況下,它看起來像上面的java多播代碼不適用於該配置。

更多細節和代碼示例在這裏: https://docs.oracle.com/javase/7/docs/api/java/nio/channels/MulticastChannel.html

// join multicast group on this interface, and also use this 
// interface for outgoing multicast datagrams 
NetworkInterface ni = NetworkInterface.getByName("hme0"); 

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

InetAddress group = InetAddress.getByName("225.4.5.6"); 

MembershipKey key = dc.join(group, ni); 
相關問題