UDPServer 和加入多播组的任何示例?
Any examples of UDPServer and joining multicast group?
刚开始使用 Netty-Reactor,想知道是否有人有关于如何使用 UdpServer 加入多播组和处理传入数据包的示例。我还想使用 UdpClient 通过网络发送消息。
当前文档中的示例有点少。
我很困惑我需要编写多少 Netty 自定义对象以及 Netty-Reactor 项目对我隐藏的内容。我看到有 UdpInbound 和 UdpOutbound。这些与通道编码器和解码器有什么关系?我还需要那些吗?
我想举一个 UDP 服务器侦听多播组并侦听发送到该组的 Google Protobuf 消息的示例。我知道如何离线进行所有 protobuf 处理..
我只是不确定如何使用 Netty-Reactor 进行实际监听。
我看到 UdpInbound.join() 看起来像我想要的..但在那之后我迷路了。
谁能给我举个例子?
谢谢
更新:
@Violeta - 感谢您的帮助和 link!它对我的帮助更大。
我想我发现了一个错误?或者我可能误解了如何让 IPv4 和 IPv6 在同一台服务器上工作。我在您的示例代码中注意到您使用了 .runOn(resources, InternetProtocolFamily.IPv4)
.
如果没有此代码,当我有一个同时分配了 IPv4 和 IPv6 地址的 InetInterface 时,我的绑定将失败。
我想在同一台服务器和所有接口上同时支持 IPv4/IPv6,因为代码将在多宿主计算机上 运行。
除了使用 .runOn
方法之外,我没有看到在连接上指定 InternetProtocolFamily
的方法。
我收到以下错误:
IFace: name:en0 (en0) Address class: /fe80:0:0:0:1ce8:a828:3c15:4f4b%en0 is Inet4Address = false
IFace: name:en0 (en0) Address class: /192.168.1.151 is Inet4Address = true
09:42:35.615 [udp-nio-1] INFO server.Application - Joining iFace name:en0 (en0) to Multicast Group /224.0.0.224
09:42:35.621 [udp-nio-1] ERROR reactor.Flux.ConcatArray.1 - onError(java.lang.IllegalArgumentException: IPv6 socket cannot join IPv4 multicast group)
09:42:35.623 [udp-nio-1] ERROR reactor.Flux.ConcatArray.1 -
java.lang.IllegalArgumentException: IPv6 socket cannot join IPv4 multicast group
at sun.nio.ch.DatagramChannelImpl.innerJoin(DatagramChannelImpl.java:814)
at sun.nio.ch.DatagramChannelImpl.join(DatagramChannelImpl.java:900)
at io.netty.channel.socket.nio.NioDatagramChannel.joinGroup(NioDatagramChannel.java:414)
at io.netty.channel.socket.nio.NioDatagramChannel.joinGroup(NioDatagramChannel.java:391)
at io.netty.channel.socket.nio.NioDatagramChannel.joinGroup(NioDatagramChannel.java:384)
at reactor.netty.udp.UdpOperations.join(UdpOperations.java:65)
at server.Application.lambda$null(Application.java:45)
UdpInbound.join()
returns Mono<Void>
,加入群后发布者完成。
之后,您可以使用 UdpInbound.receive()
.
开始接收包裹
in.join(...)
.thenMany(in.receive()
...)
...
有关示例,请参阅 here。
您可以使用 handler
方法来处理 I/O(就像在 link 中一样),或者当您收到 Connection
,您可以调用Connection.inbound()
,然后您可以加入并开始接收包裹。
关于 decoders/encoders 我们鼓励您使用 Reactor Core 中的运算符来转换传入的包。如果你不能用那种方法实现这一点,你总是可以添加一个标准的 Netty 处理程序,例如使用 doOnBound(conn -> conn.addHandler...)
刚开始使用 Netty-Reactor,想知道是否有人有关于如何使用 UdpServer 加入多播组和处理传入数据包的示例。我还想使用 UdpClient 通过网络发送消息。
当前文档中的示例有点少。
我很困惑我需要编写多少 Netty 自定义对象以及 Netty-Reactor 项目对我隐藏的内容。我看到有 UdpInbound 和 UdpOutbound。这些与通道编码器和解码器有什么关系?我还需要那些吗?
我想举一个 UDP 服务器侦听多播组并侦听发送到该组的 Google Protobuf 消息的示例。我知道如何离线进行所有 protobuf 处理..
我只是不确定如何使用 Netty-Reactor 进行实际监听。
我看到 UdpInbound.join() 看起来像我想要的..但在那之后我迷路了。
谁能给我举个例子?
谢谢
更新:
@Violeta - 感谢您的帮助和 link!它对我的帮助更大。
我想我发现了一个错误?或者我可能误解了如何让 IPv4 和 IPv6 在同一台服务器上工作。我在您的示例代码中注意到您使用了 .runOn(resources, InternetProtocolFamily.IPv4)
.
如果没有此代码,当我有一个同时分配了 IPv4 和 IPv6 地址的 InetInterface 时,我的绑定将失败。
我想在同一台服务器和所有接口上同时支持 IPv4/IPv6,因为代码将在多宿主计算机上 运行。
除了使用 .runOn
方法之外,我没有看到在连接上指定 InternetProtocolFamily
的方法。
我收到以下错误:
IFace: name:en0 (en0) Address class: /fe80:0:0:0:1ce8:a828:3c15:4f4b%en0 is Inet4Address = false
IFace: name:en0 (en0) Address class: /192.168.1.151 is Inet4Address = true
09:42:35.615 [udp-nio-1] INFO server.Application - Joining iFace name:en0 (en0) to Multicast Group /224.0.0.224
09:42:35.621 [udp-nio-1] ERROR reactor.Flux.ConcatArray.1 - onError(java.lang.IllegalArgumentException: IPv6 socket cannot join IPv4 multicast group)
09:42:35.623 [udp-nio-1] ERROR reactor.Flux.ConcatArray.1 -
java.lang.IllegalArgumentException: IPv6 socket cannot join IPv4 multicast group
at sun.nio.ch.DatagramChannelImpl.innerJoin(DatagramChannelImpl.java:814)
at sun.nio.ch.DatagramChannelImpl.join(DatagramChannelImpl.java:900)
at io.netty.channel.socket.nio.NioDatagramChannel.joinGroup(NioDatagramChannel.java:414)
at io.netty.channel.socket.nio.NioDatagramChannel.joinGroup(NioDatagramChannel.java:391)
at io.netty.channel.socket.nio.NioDatagramChannel.joinGroup(NioDatagramChannel.java:384)
at reactor.netty.udp.UdpOperations.join(UdpOperations.java:65)
at server.Application.lambda$null(Application.java:45)
UdpInbound.join()
returns Mono<Void>
,加入群后发布者完成。
之后,您可以使用 UdpInbound.receive()
.
in.join(...)
.thenMany(in.receive()
...)
...
有关示例,请参阅 here。
您可以使用 handler
方法来处理 I/O(就像在 link 中一样),或者当您收到 Connection
,您可以调用Connection.inbound()
,然后您可以加入并开始接收包裹。
关于 decoders/encoders 我们鼓励您使用 Reactor Core 中的运算符来转换传入的包。如果你不能用那种方法实现这一点,你总是可以添加一个标准的 Netty 处理程序,例如使用 doOnBound(conn -> conn.addHandler...)