2014-12-17 1 views
0

Я использую Netty для отправки и приема сообщений многоадресной передачи UDP, а когда я создаю несколько серверов на одном и том же узле, он иногда останавливает прием пакетов с других серверов. Однако, даже несмотря на то, что они не получают никакого пакета с других серверов, они все равно продолжают получать пакеты, которые отправляются с использованием того же многоадресного сервера.Серверы перестают получать пакеты многоадресной передачи UDP, когда я создаю несколько серверов на одном узле

Вот код сервера:

multicastAddress = new InetSocketAddress("239.255.27.1", 14878); 

Bootstrap a = new Bootstrap() 
       .group(group) 
       .channelFactory(() -> new NioDatagramChannel(InternetProtocolFamily.IPv4)) 
       .localAddress(multicastAddress) 
       .option(ChannelOption.IP_MULTICAST_IF, NetUtil.LOOPBACK_IF) 
       .option(ChannelOption.SO_REUSEADDR, true) 
       .handler(new ChannelInitializer<NioDatagramChannel>() { 
        @Override 
        public void initChannel(NioDatagramChannel ch) throws Exception { 
         h.pipeline().addLast(new ChannelInboundHandler() { 
           @Override 
           public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
            System.out.println(msg); 
           } 
         }); 
        } 
       }); 

multicastServer = (NioDatagramChannel) a.bind().sync().channel(); 
multicastServer.joinGroup(multicastAddress, NetUtil.LOOPBACK_IF).sync(); 

Клиент периодически посылает же ByteBuf:

multicastServer.writeAndFlush(new DatagramPacket(Unpooled.copyInt(1), multicastAddress)); 

При запуске сервера на узле, он начинает принимать пакеты, которые посылаются от этого сервера , Затем, если создать второй сервер на том же узле, он обычно работает, и сервер получает пакеты, отправленные с первого и второго серверов. Однако, когда я создаю еще несколько серверов, привязанных к одному и тому же порту (я использую ChannelOption.SO_REUSEADDR, поэтому это должно быть проблемой), иногда все серверы перестают принимать пакеты с других серверов, а только получают пакеты, которые отправляются с одного и того же сервера.

ответ

1

Проблемы здесь:

.option(ChannelOption.IP_MULTICAST_IF, NetUtil.LOOPBACK_IF) 

Это говорит UDP только посылать членские отчеты в локальном, так что другие хосты не знают, что этот хост является членом. Просто удалите его.