2017-01-25 13 views
1

У меня есть многоадресный сокет, где я должен указать сетевой интерфейс для приема данных. Однако, когда я присоединяюсь к группе, используя сетевой интерфейс, Java ее не получит. У меня есть простая программа python, которая делает то же самое на одном сервере, и она отлично работает.Ячейка многоадресной рассылки Java не принимается по определенному сетевому интерфейсу

Что мне не хватает в настройке NetworkInterface для MulticastSocket в 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, которая делает то же самое, и она отлично работает каждый раз.

Для справки питон выглядит

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

В выше питона скрипт вместо «z.z.z.z», что мне нужно предоставить? – kit

ответ

1

Переключение этого к MulticastChannel с использованием NiO пакетов решены проблемы. Не совсем уверен, что это была причина, но основным интерфейсом был igmp v3, и в некоторых случаях он выглядит так, как если бы код java multicast выше не работал с этой конфигурацией.

Более подробная информация и пример кода здесь: 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);