【Netty】Netty 核心组件 ( ServerBootstrap | Bootstrap )
文章目錄
- 一、 ServerBootstrap / Bootstrap 引導(dǎo)組件
- 二、 服務(wù)器端 ServerBootstrap 引導(dǎo)組件
- 三、 客戶端 Bootstrap 引導(dǎo)組件
一、 ServerBootstrap / Bootstrap 引導(dǎo)組件
ServerBootstrap / Bootstrap 引導(dǎo)組件 :
① 服務(wù)器 / 客戶端 配置 : ServerBootstrap / Bootstrap 組件的作用是配置 Netty 服務(wù)器 / 客戶端的各種配置 ;
② 關(guān)聯(lián)各種組件 : 該 ServerBootstrap / Bootstrap 組件將線程池 ( NioEventLoopGroup ) , 套接字通道 ( NioServerSocketChannel / SocketChannel ) , 處理者 ( Handler ) , 通道初始化器 ( ChannelInitializer ) 關(guān)聯(lián)在一起 ;
③ ServerBootstrap : 服務(wù)器端程序的引導(dǎo)組件 ;
④ Bootstrap : 客戶端程序的引導(dǎo)組件 ;
二、 服務(wù)器端 ServerBootstrap 引導(dǎo)組件
ServerBootstrap 常用方法 : 該組件類是服務(wù)器端使用的引導(dǎo)組件 ;
1 . 關(guān)聯(lián)線程池 : 關(guān)聯(lián)服務(wù)器端的 BossGroup 和 WorkerGroup 線程池 ( NioEventLoopGroup 類型 ) , parentGroup 參數(shù)是 BossGroup 負(fù)責(zé)建立客戶端連接 , childGroup 參數(shù)是 WorkerGroup 負(fù)責(zé)與客戶端進(jìn)行數(shù)據(jù)交互 ;
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup)2 . 設(shè)置通道類 : 設(shè)置服務(wù)器端的通道類型 , 一般設(shè)置 NioServerSocketChannel.class 值 ;
public B channel(Class<? extends C> channelClass)3 . 添加 BossGroup 線程池配置 : 設(shè)置服務(wù)器端的配置 , ChannelOption option 參數(shù)是設(shè)置的操作類型 , T value 參數(shù)設(shè)置參數(shù)值 ; 如 bootstrap.option(ChannelOption.SO_BACKLOG, 128) 就是設(shè)置線程隊(duì)列維護(hù)的連接個(gè)數(shù) ;
public <T> B option(ChannelOption<T> option, T value)4 . 添加 WorkerGroup 線程池配置 : 設(shè)置服務(wù)器端的配置 , ChannelOption option 參數(shù)是設(shè)置的操作類型 , T value 參數(shù)設(shè)置參數(shù)值 ; 如 bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true) 就是設(shè)置客戶端連接的狀態(tài)行為為保持連接狀態(tài) ;
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value)5 . 添加 BossGroup 線程池處理器 Handler : 給 BossGroup 線程池 ( NioEventLoopGroup 類型 ) 設(shè)置的處理器 , 該處理器需要用戶自定義 , 繼承 ChannelInboundHandlerAdapter 類 ;
public B handler(ChannelHandler handler)6 . 添加 WorkerGroup 線程池處理器 ChildHandler : 給 WorkerGroup 線程池 ( NioEventLoopGroup 類型 ) 設(shè)置處理器 , 該處理器需要用戶自定義 , 繼承 ChannelInboundHandlerAdapter 類 ;
public ServerBootstrap childHandler(ChannelHandler childHandler)7 . 綁定端口 : 服務(wù)器端的 ServerBootstrap 對(duì)象 , 調(diào)用 bind 方法 , 綁定本地的端口號(hào) , 然后監(jiān)聽(tīng)該端口的客戶端連接請(qǐng)求 ;
public ChannelFuture bind(int inetPort)8 . 服務(wù)器端常用的 ServerBootstrap 設(shè)置代碼 :
// 1. BossGroup 線程池 : 負(fù)責(zé)客戶端的連接 EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 2. WorkerGroup 線程池 : 負(fù)責(zé)客戶端連接的數(shù)據(jù)讀寫(xiě) EventLoopGroup workerGroup = new NioEventLoopGroup();// 3. 服務(wù)器啟動(dòng)對(duì)象, 需要為該對(duì)象配置各種參數(shù) ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) // 設(shè)置 主從 線程組 , 分別對(duì)應(yīng) 主 Reactor 和 從 Reactor.channel(NioServerSocketChannel.class) // 設(shè)置 NIO 網(wǎng)絡(luò)套接字通道類型.option(ChannelOption.SO_BACKLOG, 128) // 設(shè)置線程隊(duì)列維護(hù)的連接個(gè)數(shù).childOption(ChannelOption.SO_KEEPALIVE, true) // 設(shè)置連接狀態(tài)行為, 保持連接狀態(tài).childHandler( // 為 WorkerGroup 線程池對(duì)應(yīng)的 NioEventLoop 設(shè)置對(duì)應(yīng)的事件 處理器 Handlernew ChannelInitializer<SocketChannel>() {// 創(chuàng)建通道初始化對(duì)象@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 該方法在服務(wù)器與客戶端連接建立成功后會(huì)回調(diào)// 為 管道 Pipeline 設(shè)置處理器 Hanedlerch.pipeline().addLast(new ServerHandler());}});// 4. 綁定本地端口 ChannelFuture channelFuture = null;try {// 綁定本地端口, 進(jìn)行同步操作 , 并返回 ChannelFuturechannelFuture = bootstrap.bind(8888).sync();} catch (InterruptedException e) {e.printStackTrace();} finally {// 出現(xiàn)異常后, 優(yōu)雅的關(guān)閉bossGroup.shutdownGracefully();workerGroup.shutdownGracefully(); }三、 客戶端 Bootstrap 引導(dǎo)組件
Bootstrap 常用方法 :
1 . 關(guān)聯(lián)線程池 : 關(guān)聯(lián)客戶端的 NioEventLoopGroup 線程池 , 客戶端只有一個(gè)線程池 , 只需要與服務(wù)器進(jìn)行數(shù)據(jù)讀寫(xiě)交互 , EventLoopGroup group 參數(shù)就是 NioEventLoopGroup 線程池 , 負(fù)責(zé)與客戶端進(jìn)行數(shù)據(jù)交互 ;
public B group(EventLoopGroup group)2 . 設(shè)置通道類 : 設(shè)置客戶端的通道類型 , 一般設(shè)置 NioSocketChannel.class 值 ;
public B channel(Class<? extends C> channelClass)3 . 設(shè)置 NioEventLoopGroup 線程池處理器 Handler : 為客戶端的 NioEventLoopGroup 線程池 設(shè)置處理器 , 該處理器需要用戶自定義 , 繼承 ChannelInboundHandlerAdapter 類 ;
public B handler(ChannelHandler handler)4 . 連接服務(wù)器 : 連接 String inetHost 地址的 int inetPort 端口 , 建立連接用于讀寫(xiě)數(shù)據(jù) ;
public ChannelFuture connect(String inetHost, int inetPort)5 . 客戶端 Bootstrap 代碼示例 :
// 客戶端只需要一個(gè) 時(shí)間循環(huán)組 , 即 NioEventLoopGroup 線程池 EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); // 客戶端啟動(dòng)對(duì)象 Bootstrap bootstrap = new Bootstrap(); // 設(shè)置相關(guān)參數(shù) bootstrap.group(eventLoopGroup) // 設(shè)置客戶端的線程池.channel(NioSocketChannel.class) // 設(shè)置客戶端網(wǎng)絡(luò)套接字通道類型.handler( // 設(shè)置客戶端的線程池對(duì)應(yīng)的 NioEventLoop 設(shè)置對(duì)應(yīng)的事件處理器 Handlernew ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new ClientHandler());}}); try {// 開(kāi)始連接服務(wù)器, 并進(jìn)行同步操作// ChannelFuture 類分析 , Netty 異步模型// sync 作用是該方法不會(huì)再次阻塞ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8888).sync();System.out.println("客戶端連接服務(wù)器成功 ...");// 關(guān)閉通道, 開(kāi)始監(jiān)聽(tīng)channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) {e.printStackTrace(); }finally {// 優(yōu)雅的關(guān)閉eventLoopGroup.shutdownGracefully(); }總結(jié)
以上是生活随笔為你收集整理的【Netty】Netty 核心组件 ( ServerBootstrap | Bootstrap )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Netty】使用 Netty 开发 H
- 下一篇: 【Netty】Netty 核心组件 (