gpt4 book ai didi

java - 当我在同一节点上创建多个服务器时,服务器停止接收 UDP 多播数据包

转载 作者:行者123 更新时间:2023-12-01 12:06:46 25 4
gpt4 key购买 nike

我使用 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));

当我在节点上启动服务器时,它开始接收从该服务器发送的数据包。然后,如果在同一节点上创建第二个服务器,它通常会工作并且服务器会接收从第一个和第二个服务器发送的数据包。但是,当我创建更多绑定(bind)到同一端口的服务器时(我使用 ChannelOption.SO_REUSEADDR 因此这应该是一个问题),有时所有服务器都会停止从其他服务器接收数据包,而只接收以下数据包:从同一服务器发送。

最佳答案

问题出在这里:

.option(ChannelOption.IP_MULTICAST_IF, NetUtil.LOOPBACK_IF)

这告诉 UDP 仅向本地主机发送成员资格报告,因此其他主机不知道该主机是成员。只需删除它即可。

关于java - 当我在同一节点上创建多个服务器时,服务器停止接收 UDP 多播数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27536989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com