日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Netty】Netty 异步任务模型 及 Future-Listener 机制

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Netty】Netty 异步任务模型 及 Future-Listener 机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、 Netty 模型
  • 二、 異步模型
  • 三、 Future-Listener 機制
  • 四、 Future-Listener 機制代碼示例





一、 Netty 模型



以服務器端為例



1 . 線程池 : Netty 模型核心就是兩個線程池 , BossGroup 線程池 WorkerGroup 線程池 ;


① BossGroup 線程池 : 負責維護客戶端連接操作 ;

② WorkerGroup 線程池 : 負責與客戶端進行數據交互 ;

③ 線程池類型 : 上述兩個線程池 ( BossGroup / WorkerGroup ) 都是 NioEventLoopGroup 類型的 ;

④ 線程池中的線程 : NioEventLoopGroup 線程池中維護了多個 NioEventLoop 線程 ;



2 . 線程池中的線程 : NioEventLoopGroup 線程池中維護了若干 NioEventLoop 線程 , 這相當于主從反應器 ( Reactor ) 模型中的反應器 , 每個 NioEventLoop 中都有一個 選擇器 ( Selector ) , 用于監聽 Socket IO 事件 , 如 建立連接 , 數據讀寫 等 ;



3 . NioEventLoop 工作流程 :


NioEventLoop 中可以按照一定順序進行數據處理 , 如數據到來后 , 按照下面的流程執行一系列操作 ;

讀取數據 -> 數據解碼 -> 業務邏輯處理 -> 數據編碼 -> 數據發送



4 . NioEventLoop 中封裝內容 :

  • 選擇器 Selector
  • 任務隊列 TaskQueue
  • 調度任務隊列 ScheduleTaskQueue
  • NIO 通道 NioChannel
  • 管道 ChannelPipeline


上面是 Netty 的模型的總體架構 , 下面重點介紹 Netty 模型中的異步模型 , Netty 中的每次綁定端口 , 連接遠程端口 , 讀寫數據都要涉及到異步操作 ;





二、 異步模型



1 . 異步操作概念 : 調用者調用一個異步操作后 , 并不能馬上知道該操作的返回值 , 該操作也不會馬上執行完成 , 該操作完成后 , 會通過回調機制 , 如 通知 , 注冊的回調函數等機制通知調用者 ;



2 . Netty 中的異步操作與 ChannelFuture 返回值 :


① 異步操作 : Netty 模型中凡是關于 IO 的操作 , 如綁定端口 ( Bind ) , 遠程連接 ( Connect ) , 讀取數據 ( Read ) , 寫出數據 ( Write ) 等操作都是異步操作 ;

② 異步操作返回值 : 上述 IO 操作返回值都是 ChannelFuture 類型實例 , ChannelFuture 是異步 IO 操作的返回結果 ;

③ 在服務器端綁定端口號時 , 調用 Bootstrap 的 bind 方法 , 會返回 ChannelFuture 對象 ;

④ 在客戶端調用 Bootstrap 的 connect 方法 , 也會返回 ChannelFuture 對象 ;



3 . Netty 中的異步操作機制 :


① Future-Listener 機制 : Future 表示當前不知道結果 , 在未來的某個時刻才知道結果 , Listener 表示監聽操作 , 監聽返回的結果 ;

② Netty 異步模型的兩個基礎 : Future ( ChannelFuture 未來知道結果 ) , Callback ( 監聽回調 ) ;



4 . 以客戶端寫出數據到服務器端為例 :


客戶端寫出數據 : 客戶端調用寫出數據方法 ChannelFuture writeAndFlush(Object msg) , 向服務器寫出數據 ;

操作耗時 : 假設在服務器中接收到該數據后 , 要執行一個非常耗時的操作才能返回結果 , 就是操作非常耗時 ;

客戶端不等待 : 客戶端這里寫出了數據 , 肯定不能阻塞等待寫出操作的結果 , 需要立刻執行下面的操作 , 因此該方法是異步的 ;

客戶端監聽 : writeAndFlush 方法返回一個 ChannelFuture 對象 , 如果客戶端需要該操作的返回結果 , 那么通過 ChannelFuture 可以監聽該寫出方法是否成功 ;



5 . 異步操作返回結果 :


① 返回結果 : Future 表示異步 IO 操作執行結果 , 通過該 Future 提供的 檢索 , 計算 等方法檢查異步操作是否執行完成 ;

② 常用接口 : ChannelFuture 繼承了 Future , 也是一個接口 , 可以為該接口對象注冊監聽器 , 當異步任務完成后會回調該監聽器方法 ;

public interface ChannelFuture extends Future<Void>

6 . Future 鏈式操作 : 這里以讀取數據 , 處理后返回結果為例 ;


  • 數據讀取操作 ;

  • 對讀取的數據進行解碼處理 ;

  • 執行業務邏輯

  • 將數據編碼 ;

  • 將編碼后的數據寫出 ;

上述 555 個步驟 , 每個數據處理操作 , 都有與之對應的 Handler 處理器 ;

異步機制 : 在 Handler 處理器中需要實現異步機制 , 一般使用 Callback 回調 , 或 Future 機制 ;


鏈式操作優勢 : 上述的鏈式操作 , 簡潔 , 高效 , 可以讓開發者快速開發高性能 , 高可靠性服務器 , 只關注業務邏輯 , 不用過多的將精力浪費在網絡基礎功能開發上 ;

這里的網絡基礎功能就是高可靠性 , 高性能的網絡傳輸模塊 ;





三、 Future-Listener 機制



1 . Future-Listener 機制 :


① Future 返回值 : 在 Netty 中執行 IO 操作 , 如 bind , read , write , connect 等方法 , 會立刻返回 ChannelFuture 對象 ;

② ChannelFuture 返回時狀態 : 調用 IO 方法后 , 立刻返回 ChannelFuture 對象 , 此時該操作未完成 ;

③ 注冊監聽器 : ChannelFuture 可以設置 ChannelFutureListener 監聽器 , 監聽該 IO 操作完成狀態 , 如果 IO 操作完成 , 那么會回調其 public void operationComplete(ChannelFuture future) throws Exception 接口實現方法 ;

④ IO 操作執行狀態判定 : 在 operationComplete 方法中通過 調用 ChannelFuture future 參數的如下方法 , 判定當前 IO 操作完成狀態 ;

  • future.isDone() : IO 操作是否完成 ;
  • future.isSuccess() : IO 操作是否成功 ; ( 常用 )
  • future.isCancelled() : IO 操作是否被取消 ;
  • future.cause() : IO 操作的失敗原因 ;


2 . IO 操作的同步與異步 :


① 同步 IO 操作 : BIO 中的同步 IO 操作 , 會阻塞當前的線程 , IO 操作返回前 , 處于阻塞狀態 , 不能執行其它操作 ;

② 異步 IO 操作 : 異步 IO 操作不會阻塞當前的線程 , 調用 IO 操作之后 , 可以立即執行其它操作 , 不會阻塞當前線程 , 該機制非常適用于高并發的場景 , 開發穩定 , 并發 , 高吞吐量 的服務器 ;



3 . 核心代碼示例 :

// 監聽綁定操作的結果 // 添加 ChannelFutureListener 監聽器, 監聽 bind 操作的結果 channelFuture.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) throws Exception {if(future.isDone()){System.out.println("綁定端口完成");}if(future.isSuccess()){System.out.println("綁定端口成功");}else{System.out.println("綁定端口失敗");}if(future.isCancelled()){System.out.println("綁定端口取消");}System.out.println("失敗原因 : " + future.cause());} });



四、 Future-Listener 機制代碼示例



1 . 代碼示例 : 這里以服務器程序為例 , 客戶端程序就不貼了 ;

package kim.hsl.netty;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel;/*** Netty 案例服務器端*/ public class Server {public static void main(String[] args) {// 1. 創建 BossGroup 線程池 和 WorkerGroup 線程池, 其中維護 NioEventLoop 線程// NioEventLoop 線程中執行無限循環操作// BossGroup 線程池 : 負責客戶端的連接// 指定線程個數 : 客戶端個數很少, 不用很多線程維護, 這里指定線程池中線程個數為 1EventLoopGroup bossGroup = new NioEventLoopGroup(1);// WorkerGroup 線程池 : 負責客戶端連接的數據讀寫EventLoopGroup workerGroup = new NioEventLoopGroup();// 2. 服務器啟動對象, 需要為該對象配置各種參數ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup) // 設置 主從 線程組 , 分別對應 主 Reactor 和 從 Reactor.channel(NioServerSocketChannel.class) // 設置 NIO 網絡套接字通道類型.option(ChannelOption.SO_BACKLOG, 128) // 設置線程隊列維護的連接個數.childOption(ChannelOption.SO_KEEPALIVE, true) // 設置連接狀態行為, 保持連接狀態.childHandler( // 為 WorkerGroup 線程池對應的 NioEventLoop 設置對應的事件 處理器 Handlernew ChannelInitializer<SocketChannel>() {// 創建通道初始化對象@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 該方法在服務器與客戶端連接建立成功后會回調// 為 管道 Pipeline 設置處理器 Hanedler// 這里暫時設置為 null , 執行不會失敗 , 服務器綁定端口會成功ch.pipeline().addLast(null);}});System.out.println("服務器準備完畢 ...");ChannelFuture channelFuture = null;try {// 綁定本地端口, 進行同步操作 , 并返回 ChannelFuturechannelFuture = bootstrap.bind(8888).sync();System.out.println("服務器開始監聽 8888 端口 ...");// ( 本次示例核心代碼 ) ----------------------------------------------------------// 監聽綁定操作的結果 ( 本次示例核心代碼 )// 添加 ChannelFutureListener 監聽器, 監聽 bind 操作的結果channelFuture.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) throws Exception {if(future.isDone()){System.out.println("綁定端口完成");}if(future.isSuccess()){System.out.println("綁定端口成功");}else{System.out.println("綁定端口失敗");}if(future.isCancelled()){System.out.println("綁定端口取消");}System.out.println("失敗原因 : " + future.cause());}});// ( 本次示例核心代碼 ) ----------------------------------------------------------// 關閉通道 , 開始監聽操作channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {// 出現異常后, 優雅的關閉bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}} }

2 . 執行結果 : 執行上述服務器 , 由此可見 綁定 bind 操作執行完成 , 并且執行成功 , 沒有失敗 , 因此失敗原因為 null ;

總結

以上是生活随笔為你收集整理的【Netty】Netty 异步任务模型 及 Future-Listener 机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av网站地址 | 先锋影音av资源在线观看 | 亚洲毛片一区二区 | 色婷婷a | av动漫网站 | 男女午夜激情 | 亚洲三级精品 | 欧美日韩精品一区二区三区视频播放 | 欧美美女性视频 | 国产伦子伦对白视频 | 香蕉在线观看视频 | 欧美又粗又大xxxxbbbb疯狂 | 青青草成人网 | 亚洲欧美国产一区二区三区 | 亚洲一区二区三区国产 | 亚洲第一天堂在线观看 | 久久久久久99精品久久久 | 国产成人激情视频 | 视频在线观看免费 | 无码人妻一区二区三区在线视频 | 亚洲www色 | 日韩高清在线观看 | 免费看女生裸体视频 | 丝袜美腿亚洲综合 | 欧美激情偷拍 | 国产精品蜜臀 | 中文字幕乱码人妻无码久久95 | 亚洲黄色免费观看 | 亚洲一级色 | 日韩欧美xxx| 四川丰满妇女毛片四川话 | 亚洲成人影音 | 四季av中文字幕一区 | 日日久| 欧美激情第1页 | 最全aⅴ番号库网 | 国产成人小视频在线观看 | 人妻熟女一区二区三区app下载 | 国产又黄又粗又猛又爽的视频 | 精品福利在线观看 | 91色偷偷 | 熟女毛片 | 紧身裙女教师三上悠亚红杏 | 午夜欧美日韩 | 欧美日韩在线一区二区 | 1024手机在线观看 | 久久免费福利 | 久草久草久草 | 久久久高清 | 伊人日韩| 91在线超碰| 国产视频黄色 | 日韩3区 | 亚洲国产日韩一区二区 | 实拍女处破www免费看 | 天天做天天爱天天做 | 亚洲综合日韩 | 免费的黄色网 | 老司机免费在线视频 | caoprom97| 亚洲一区二区三区在线观看视频 | 日韩av免费在线播放 | 三级做爰在线观看视频 | 中文字幕色哟哟 | 波多野结衣 在线 | 国产99久久九九精品无码免费 | 超碰97人人射妻 | 午夜视频一区二区 | 日韩av在线播放一区 | 无码国产69精品久久久久网站 | 国产黄色av网站 | 国产人妻黑人一区二区三区 | 波多野结衣理论片 | av免费观 | 我的公把我弄高潮了视频 | 男女免费观看视频 | 在线免费黄色av | 日韩综合网| 丁香激情综合 | 国产免费av网站 | 日韩区在线 | 成人在线观看www | av片在线观看 | 射进来av影视 | 日韩在线观看不卡 | 中文字幕av在线免费 | 日韩r级在线观看 | 亚洲成a人v| 青青草社区| 免费的黄色一级片 | 久久三级网 | 日韩欧美aⅴ综合网站发布 国产成人一区二区三区小说 | 国产网址在线观看 | 欧美福利小视频 | 天天色天天射天天干 | 梦梦电影免费高清在线观看 | 一区二区三区四区视频在线观看 | www.youji.com| 天天干,天天爽 |