2014-12-17 6 views
0

UDP 멀티 캐스트 메시지를 보내고받는 데 Netty를 사용하고 같은 서버에 여러 서버를 만들 때 다른 서버에서 패킷 수신을 중지하는 경우가 있습니다. 그러나 다른 서버에서 패킷을받지 못하더라도 동일한 멀티 캐스트 서버를 사용하여 전송 된 패킷을 계속 수신합니다. 클라이언트는 주기적으로 같은 ByteBuf를 전송 동일한 노드에 여러 개의 서버를 만들 때 서버에서 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(); 

는 :

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

I는 노드 서버를 시작은 시작 패킷을 수신하는 서버로부터 전송되는 다음

서버 코드 . 그런 다음 두 번째 서버를 동일한 노드에 만들면 일반적으로 작동하고 서버는 첫 번째 및 두 번째 서버에서 보낸 패킷을받습니다. 그러나 동일한 포트에 바인딩 된 몇 가지 서버를 만들 때 (즉, ChannelOption.SO_REUSEADDR을 사용해야 함) 때로는 모든 서버가 다른 서버의 패킷 수신을 중지하는 대신 동일한 서버에서 보낸 패킷 만 수신합니다.

답변

1

문제는 여기에 있습니다 : 다른 호스트가이 호스트가 구성원 인 것을 알고하지 않도록

.option(ChannelOption.IP_MULTICAST_IF, NetUtil.LOOPBACK_IF) 

이것은 단지 로컬 호스트에 회원 보고서를 보낼 UDP를 알려줍니다. 그냥 제거하십시오.