如何解决Reactor-Netty:是否同时监听IPv4和IPv6?
是否有可能让反应堆网络监听IPv4和IPv6 UDP流量?
我们有一个旧版应用程序,我想使用反应器网际网络协议TCP / UDP进行连接处理,而不是使用原始Java套接字等进行重写。我可以直接使用Netty,但是就像Reactor-给我的响应流一样净额。
感谢@Violeta帮助我解决了有关如何使用多播UDP的最初问题。
现在,我有以下代码将所有通过IPv4的网络接口绑定到多播组224.0.0.224
,并且我可以很好地接收消息。
我现在想建立另一个连接,该连接执行相同的处理,但使用IPv6和多播组FF02::1
我尝试使用另一个调用.runOn(resources,InternetProtocolFamily.IPv6)
的方法,但这引发了异常,因为我已经事先调用了该方法。
因此,我刚刚创建了我的代码的另一个实例,并将其更改为可与IPv6一起使用。
代码似乎可以正常工作,我在IPv4和IPv6上都获得了流量,并且只是想知道这是否是设置这种情况的正确方法。
我们需要侦听计算机中的所有接口,并侦听端口35057并加入多播组。
在Vert.x中,我通过定义单独的DatagramChannels来实现相同的目的,每个DatagramChannels都有自己的通道选项集,并且由于Vert.x在幕后使用Netty,所以我假设我必须创建两个Connection
实例已经有。
谢谢..
public class Application {
private final static Logger LOG = LoggerFactory.getLogger(Application.class);
protected final static String IP4_MULTICAST_GROUP = "224.0.0.224";
protected final static String IP6_MULTICAST_GROUP = "FF02::1";
public static void main(String[] args) throws SocketException,UnkNownHostException {
Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
final InetAddress multicastGroup = InetAddress.getByName(IP4_MULTICAST_GROUP);
final InetAddress multicastGroup6 = InetAddress.getByName(IP6_MULTICAST_GROUP);
final NetworkInterface multicastInterface = NetUtils.mainInterface();
LOG.info("Using network interface '{}' for multicast",multicastInterface);
LoopResources resources = LoopResources.create("test");
Connection ipv4 =
UdpServer.create()
.bindAddress(() -> new InetSocketAddress(35057))
.option(ChannelOption.so_REUSEADDR,true)
.doOnBound(conn -> conn.addHandler(new UdpDecoderHandler()))
.runOn(resources,InternetProtocolFamily.IPv4)
.handle((in,out) -> Flux.<NetworkInterface>generate(s -> {
if (ifaces.hasMoreElements()) {
s.next(ifaces.nextElement());
} else {
s.complete();
}
}).flatMap(iface -> {
if (NetUtils.isMulticastEnabledIPv4Interface(iface)) {
LOG.info("Joining iFace {} to Multicast Group {} ",iface,IP4_MULTICAST_GROUP);
return in.join(multicastGroup,iface);
}
return Flux.empty();
}).thenMany(
out.sendobject(
in.receiveObject().flatMap(o -> {
if (o instanceof SupDataInfo) {
return parseAndbuildresponse(o);
} else {
return Mono.error(new Exception("Invalid Payload: " + o));
}
}))
).onErrorContinue((error,obj) -> LOG.error("Opps: {}",obj,error)))
.bindNow(Duration.ofSeconds(30));
ipv4.ondispose();
Connection ipv6 =
UdpServer.create()
.bindAddress(() -> new InetSocketAddress(35057))
.option(ChannelOption.so_REUSEADDR,true)
.option(ChannelOption.IP_MULTICAST_IF,multicastInterface)
.doOnBound(conn -> conn.addHandler(new UdpDecoderHandler()))
.runOn(resources,InternetProtocolFamily.IPv6)
.handle((in,out) -> Flux.<NetworkInterface>generate(s -> {
if (ifaces.hasMoreElements()) {
s.next(ifaces.nextElement());
} else {
s.complete();
}
}).flatMap(iface -> {
if (NetUtils.isMulticastEnabledIPv6Interface(iface)) {
LOG.info("Joining iFace {} to Multicast Group {} ",IP6_MULTICAST_GROUP);
return in.join(multicastGroup6,error)))
.bindNow(Duration.ofSeconds(30));
ipv6.ondispose()
.block();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。