Channel是Netty的核心概念之一,它是Netty網絡通訊的主體,由它負責同對端進行網絡通訊、註冊和數據操做等功能。
如上圖所示:promise
如上圖所示,Channel包含註冊、活躍、非活躍和非註冊狀態,在通常狀況下是從註冊->活躍->非活躍->非註冊,但用戶能夠從eventloop取消和重註冊channel,所以在此狀況下活躍->非註冊->註冊安全
多個channel能夠註冊到一個eventloop上,全部的操做都是順序執行的,eventloop會依據channel的事件調用channel的方法進行相關操做,每一個channel的操做和處理在eventloop中都是順序的,以下圖:
ChannelPipeline和ChannelHandler用於channel事件的攔截和處理,Netty使用相似責任鏈的模式來設計ChannelPipeline和ChannelHandler ChannelPipeline至關於ChannelHandler的容器,channel事件消息在ChannelPipeline中流動和傳播,相應的事件可以被ChannelHandler攔截處理、傳遞、忽略或者終止,以下圖所示:
inbound:當發生某個I/O操做時由IO線程流向用戶業務處理線程的事件,如鏈路創建、鏈路關閉或者讀完成等 outbound:由用戶線程或者代碼發起的IO操做事件
每一個ChannelHandler 被添加到ChannelPipeline 後,都會建立一個ChannelHandlerContext 並與之建立的ChannelHandler 關聯綁定。以下圖:
ChannelHandler經過ChannelHandlerContext來操做channel和channelpipeline
ChannelHandler負責I/O事件或者I/O操做進行攔截和處理,用戶能夠經過ChannelHandlerAdapter來選擇性的實現本身感興趣的事件攔截和處理。
因爲Channel只負責實際的I/O操做,所以數據的編解碼和實際處理都須要經過ChannelHandler進行處理。網絡
ChannelPipeline是線程安全的,多個業務線程能夠併發的操做ChannelPipeline;ChannelHandler不是線程安全的,用戶須要本身保重ChannelHandler的線程安全併發
在Netty中,全部的I/O操做都是異步的,所以調用一個I/O操做後,將繼續當前線程的執行,但I/O操做的結果怎麼得到?——ChannelFuture。
如上圖,當前線程A異步發起I/O操做後,不阻塞繼續執行相關操做,當IO線程B完成後,經過回調執行A設置的回調方法。異步
回調方法經過監聽的形式實現:ChannelFutureListener。
ChannelPromise是ChannelFuture的擴展,容許設置I/O操做的結果,使ChannelFutureListener能夠執行相關操做oop