2.Netty TCP服务器(TcpServer)
目录
Netty TCP服务器(TcpServer)
Reactor Netty提供了一个易于使用和配置的TcpServer。它隐藏Netty了创建TCP服务器所需的大部分功能并增加了Reactive Streams背压(Reactive Streams是具有无阻塞背压的异步流处理的标准)
启动和停止
import reactor.netty.DisposableServer;
import reactor.netty.tcp.TcpServer;
public class Application {
public static void main(String[] args) {
DisposableServer server =
TcpServer.create() // 创建一个TcpServer 准备好配置的实例
.bindNow(); // 以阻塞方式启动服务器并等待它完成初始化
server.onDispose()
.block();
}
}
启动和停止(主机和端口)
要在特定的host和上提供服务port,可以将以下配置应用到TCP服务器:
import reactor.netty.DisposableServer;
import reactor.netty.tcp.TcpServer;
public class Application {
public static void main(String[] args) {
DisposableServer server =
TcpServer.create()
.host("localhost")
.port(8080)
.bindNow();
server.onDispose()
.block();
}
}
import reactor.core.publisher.Mono;
import reactor.netty.DisposableServer;
import reactor.netty.tcp.TcpServer;
public class MultiAddressApplication {
public static void main(String[] args) {
TcpServer tcpServer = TcpServer.create();
// 配置第一台TCP服务器主机、端口
DisposableServer server1 = tcpServer
.host("localhost")
.port(8080)
.bindNow();
// 配置第二台TCP服务器主机、端口
DisposableServer server2 = tcpServer
.host("0.0.0.0")
.port(8081)
.bindNow();
Mono.when(server1.onDispose(), server2.onDispose())
.block();
}
}
急切初始化
默认情况下,TcpServer资源的初始化是按需进行的。这意味着bind operation吸收了初始化和加载所需的额外时间:
①:事件循环组
②:本机传输库(使用本机传输时)
③:用于安全性的本机库(在的情况下OpenSsl)
import reactor.netty.DisposableServer;
import reactor.netty.tcp.TcpServer;
public class Application {
public static void main(String[] args) {
TcpServer tcpServer =
TcpServer.create()
.handle((inbound, outbound) -> inbound.receive().then());
tcpServer.warmup() // 初始化并加载事件循环组、本机传输库和用于安全性的本机库
.block();
DisposableServer server = tcpServer.bindNow();
server.onDispose()
.block();
}
}
消费客户端数据
为了从连接的客户端接收数据,必须附加一个I/O 处理程序。I/O 处理程序可以访问NettyInbound以读取数据。
import reactor.netty.DisposableServer;
import reactor.netty.tcp.TcpServer;
public class Application {
public static void main(String[] args) {
DisposableServer server =
TcpServer.create()
// 从连接的客户端接收数据
.handle((inbound, outbound) -> inbound.receive().then())
.bindNow();
server.onDispose()
.block();
}
}
生命周期回调
TcpServer提供了以下生命周期回调以便扩展。
| 回调函数 | 描述 |
|---|---|
| doOnBind | 在服务器通道即将绑定时调用 |
| doOnBound | 在绑定服务器通道时调用 |
| doOnChannelInit | 初始化通道时调用 |
| doOnConnection | 连接远程客户端时调用 |
| doOnUnbound | 当服务器通道未绑定时调用 |
使用doOnConnection和doOnChannelInit回调:
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.ReadTimeoutHandler;
import reactor.netty.DisposableServer;
import reactor.netty.tcp.TcpServer;
import java.util.concurrent.TimeUnit;
public class Application {
public static void main(String[] args) {
DisposableServer server =
TcpServer.create()
// 当连接远程客户端时,Netty管道使用ReadTimeoutHandler进行扩展
.doOnConnection(conn ->
conn.addHandler(new ReadTimeoutHandler(10, TimeUnit.SECONDS)))
// 初始化通道时,Netty管道使用LoggingHandler进行扩展
.doOnChannelInit((observer, channel, remoteAddress) ->
channel.pipeline()
.addFirst(new LoggingHandler("reactor.netty.examples")))
.bindNow();
server.onDispose()
.block();
}
}
TCP-level配置(三种配置)
(1)Setting Channel Options:设置通道参数选项
默认情况下,TCP服务器配置有以下选项:
Map
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
