2017-01-25 16 views
1

データを受信するためにネットワークインターフェイスを指定する必要があるマルチキャストソケットがあります。しかし、ネットワークインタフェースを使用してグループに参加すると、Javaはそれを受信しません。私は、同じサーバー上でまったく同じことをするシンプルなPythonプログラムを持っており、うまく動作します。特定のネットワークインターフェイスでJavaマルチキャストソケットが受信されない

NetworkInterfaceのJavaでのマルチキャストソケットの設定には何がありますか?

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プログラムを持っており、毎回完璧に動作します。

参考のためのpythonは

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

詳細と、ここでのサンプルコードは? – kit

答えて

1

はNIOパッケージは、問題を解決使用してMulticastChannelにこれを切り替えるように見えます。原因は完全にはわかっていませんが、基盤となるインターフェイスはigmp v3であり、場合によっては上記のJavaマルチキャストコードがその設定で動作しないように見えます。私は提供するために必要なものの代わりに「z.z.z.z」の上のPythonスクリプトで 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); 
関連する問題