Reactor Netty参考指南目录
原文地址
Reactor Netty
提供了易于使用和配置的UdpServer
。它隐藏了创建UDP
服务器所需的大部分Netty
的功能,并增加了Reactive Streams
背压。
7.1.启动和停止
如果要启动一个UDP
服务器,您必须创建并且配置一个UdpServer
实例对象。默认情况下,host为localhost
,port为12012
。下面是创建并且启动一个UdpServer
服务器的例子:
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/udp/server/create/Application.java
import reactor.netty.Connection; import reactor.netty.udp.UdpServer; import java.time.Duration; public class Application { public static void main(String[] args) { Connection server = UdpServer.create() //<1> .bindNow(Duration.ofSeconds(30)); //<2> server.onDispose() .block(); } }
<1> 创建一个
UdpServer
实例用来做配置操作。<2> 使用阻塞等待的方式启动服务器,直到初始化完成。
返回的Connection
提供了简单的服务器API,包括disposeNow()
,这个方法可以以阻塞等待的方式来关闭服务器。
7.1.1.Host和Port
想要设置特定host
和port
,您可以用下面的方式来配置UDP
服务器:
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/udp/server/address/Application.java
import reactor.netty.Connection; import reactor.netty.udp.UdpServer; import java.time.Duration; public class Application { public static void main(String[] args) { Connection server = UdpServer.create() .host("localhost") //<1> .port(8080) //<2> .bindNow(Duration.ofSeconds(30)); server.onDispose() .block(); } }
<1> 配置
UDP
服务器的host<2> 配置
UDP
服务器的port
7.2.预先初始化
默认情况下,UdpServer
初始化资源的操作在需要使用的时候才进行。这意味着初始化加载的时候bind operation
会占用额外的时间:
-
事件循环组
-
native传输库(当使用了native传输的时候)
当您需要预加载这些资源的时候,您可以按照以下方式来配置UdpServer
:
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/udp/server/warmup/Application.java
import io.netty.channel.socket.DatagramPacket; import reactor.core.publisher.Mono; import reactor.netty.Connection; import reactor.netty.udp.UdpServer; import java.time.Duration; public class Application { public static void main(String[] args) { UdpServer udpServer = UdpServer.create() .handle((in, out) -> out.sendObject( in.receiveObject() .map(o -> { if (o instanceof DatagramPacket) { DatagramPacket p = (DatagramPacket) o; return new DatagramPacket(p.content().retain(), p.sender()); } else { return Mono.error(new Exception