我使用Netty发送和接收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
因此它应该是一个问题)有时所有服务器都停止从其他服务器接收数据包而只接收从同一端口发送的数据包服务器
答案 0 :(得分:1)
问题在于:
.option(ChannelOption.IP_MULTICAST_IF, NetUtil.LOOPBACK_IF)
这告诉UDP只向本地主机发送成员资格报告,因此其他主机不知道该主机是其成员。只需删除它。