2.Netty TCP服务器(TcpServer)

2024-07-13 1379阅读

目录


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
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]