Netty學習記錄-入門篇( 四 )

實際開發過程中 , 在拿到channel之后,做一個判斷,看是什么連接,如(channel instanceof SocketChannel/DatagramChannel),就可以做不同的業務處理 。
SelectorNetty基于Selector對象實現I/O多路復用,通過Selector一個線程可以監聽多個連接的Channel事件 。當向一個Selector中注冊Channel后 ,  Selector內部的機制就可以自動不斷地查詢(Select)這些注冊的Channel是否有已就緒的I/O事件(例如可讀,可寫,網絡連接完成等),這樣程序就可以很簡單地使用一個線程高效地管理多個Channel 。
ChannelHandler 及其實現類ChannelHandler是一個接口 , 處理 I/O 事件或攔截 I/O 操作,并將其轉發到其 ChannelPipeline(業務處理鏈)中的下一個處理程序 。
ChannelHandler及其實現類一覽圖:

Netty學習記錄-入門篇

文章插圖
【Netty學習記錄-入門篇】- ChannelInboundHandler 用于處理入站 I/O 事件 。- ChannelOutboundHandler 用于處理出站 I/O 操作 。- ChannelInboundHandlerAdapter 用于處理入站 I/O 事件 。- ChannelOutboundHandlerAdapter 用于處理出站 I/O 操作 。- ChannelDuplexHandler 用于處理入站和出站事件 。Pipeline 和 ChannelPipelineChannelPipeline 是一個 Handler 的集合,它負責處理和攔截 inbound 或者 outbound 的事件和操作,相當于一個貫穿 Netty 的鏈 。(也可以這樣理解:ChannelPipeline 是 保存 ChannelHandler 的 List,用于處理或攔截 Channel 的入站事件和出站操作) 。
ChannelPipeline 實現了一種高級形式的攔截過濾器模式,使用戶可以完全控制事件的處理方式,以及 Channel 中各個的 ChannelHandler 如何相互交互 。
在 Netty 中每個 Channel 都有且僅有一個 ChannelPipeline 與之對應 , 它們的組成關系如下:
Netty學習記錄-入門篇

文章插圖
一個 Channel 包含了一個 ChannelPipeline,而 ChannelPipeline 中又維護了一個由 ChannelHandlerContext 組成的雙向鏈表,并且每個ChannelHandlerContext中又關聯著一個 ChannelHandler 。
入站事件和出站事件在一個雙向鏈表中,入站事件會從鏈表 head 往后傳遞到最后一個入站的 handler,出站事件會從鏈表 tail 往前傳遞到最前一個出站的 handler,兩種類型的 handler 互不干擾 。
常用方法:
- ChannelPipeline addFirst(ChannelHandler... handlers) , 把一個業務處理類(handler)添加到鏈中的第一個位置 。- ChannelPipeline addLast(ChannelHandler... handlers),把一個業務處理類(handler)添加到鏈中的最后一個位置 。ChannelHandlerContext保存Channel相關的所有上下文信息,同時關聯一個ChannelHandler對象ChannelHandlerContext中包含一個具體的事件處理器ChannelHandler,同時ChannelHandlerContext 中也綁定了對應的pipeline和Channel的信息,方便對ChannelHandler進行調用 。
常用方法:
- ChannelFuture close(): 關閉通道- ChannelOutboundInvoker flush(): 刷新- ChannelFuture writeAndFlush(Object msg): 將數據寫到ChannelPipeline中當前ChannelHandler的下一個ChannelHandler開始處理 。ChannelOption
  • ChannelOption.SO_BACKLOG
    • 對應TCP/IP協議listen函數中的backlog參數 , 用來初始化服務器可連接隊列大小 。服務端處理客戶端連接請求時順序處理的,所以同一時間只能處理一個客戶端連接 。多個客戶端來的時候,服務器將不能處理的客戶端連接請求放在隊列中等待處理,backlog參數指定了隊列的大小 。
  • ChannelOption.SO_KEEPALIVE
    • 一直保持連接活動狀態 。
EventLoopGroup 和其實現類 NioEventLoopGroup
Netty學習記錄-入門篇

文章插圖
  • BoosEventLoopGroup通常是一個單線程的EventLoop , EventLoop維護著一個注冊了ServerSocketChannel的Selector實例 , BossEventLoop不斷輪詢將連接事件分離出來 。
  • 通常是OP_ACCEPT事件,然后將接收到的SocketChannel交給WorkerEventLoopGroup
  • WorkerEventLoopGroup會由next選擇其中一個EventLoop來將這個SocketChannel注冊到其維護的Selector并對其后續的IO事件進行處理 。
常用方法:

推薦閱讀