Netty4學習筆記(8)-- Channel接口

Channel接口

Channel是Netty4最核心的接口之一,擁有將近40個方法和一個內部接口。本文將對Channel接口的衆多方法做一個歸類和總結,爲進一步研究Channel實現做準備。Channel繼承了AttributeMap接口,關於AttributeMap的詳細介紹請看上一篇文章

public interface Channel extends AttributeMap, Comparable<Channel> {
   ...
}

類似getter的方法

SocketAddress localAddress();
SocketAddress remoteAddress();
ChannelConfig config();
ChannelMetadata metadata();
Channel parent();
EventLoop eventLoop();
ChannelPipeline pipeline();
ByteBufAllocator alloc();
Unsafe unsafe();

這一組方法最容易理解:

  • localAddress()返回channel綁定的本地地址,remoteAddress()返回與Channel連接的遠程地址
  • config()返回一個ChannelConfig對象,通過這個對象可以配置Channel相關的參數
  • metadata()返回一個ChannelMetadata對象,通過這個對象可以查詢具體的Channel實現是否支持某種操作。目前ChannelMetadata只有一個方法,hasDisconnect(),用來查詢Channel實現是否支持disconnect()操作。
  • parent()方法返回一個Channel的父Channel。按照Javadoc的說法,視Channel如何被創建而定,Channel可能會有一個父Channel。比如說如果一個SocketChannel是被ServerSocketChannel創建(accept)的,那麼調用SocketChannel的parent()方法就會返回這個ServerSocketChannel
  • eventLoop()方法返回Channel註冊到了哪個EventLoop
  • pipeline()方法返回Channel的Pipeline
  • alloc()方法返回與Channel關聯的ByteBufAllocator實例
  • unsafe()方法返回一個Unsafe實例。這個Unsafe實例只供Channel實現內部使用

狀態查詢方法

boolean isOpen();
boolean isRegistered();
boolean isActive();
boolean isWritable(); 

這組方法用於查詢Channel的當前狀態。isWritable()方法比較有誤導性,看起來好像是說Channel是否是可寫,但實際是查詢寫操作是否可以立即被IO線程處理。其餘三個方法將在後面的文章裏詳細分析。


Future相關方法

ChannelFuture closeFuture();
ChannelPromise voidPromise();
ChannelPromise newPromise();
ChannelProgressivePromise newProgressivePromise();
ChannelFuture newSucceededFuture();
ChannelFuture newFailedFuture(Throwable cause);

這組方法其實又可以分爲兩種,closeFuture()voidPromise()可以算作getter方法,剩下四個以new開頭的方法是工廠方法


事件觸發方法

ChannelFuture bind(SocketAddress localAddress);
ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise);
ChannelFuture connect(SocketAddress remoteAddress);
ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress);
ChannelFuture connect(SocketAddress remoteAddress, ChannelPromise promise);
ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise);
ChannelFuture disconnect();
ChannelFuture disconnect(ChannelPromise promise);
ChannelFuture close();
ChannelFuture close(ChannelPromise promise);

Channel read();
ChannelFuture write(Object msg);
ChannelFuture write(Object msg, ChannelPromise promise);
Channel flush();
ChannelFuture writeAndFlush(Object msg, ChannelPromise promise);
ChannelFuture writeAndFlush(Object msg);

這組方法會觸發I/O事件,這些事件會通過ChannelPipelineChannelHandler處理。要想知道事件如何在Pipeline裏傳播,請看這篇文章


Unsafe接口

Unsafe接口是Channel的一個內部接口,我沒弄明白這個接口的設計意圖,暫時只能根據接口名和Javadoc的說明得出以下結論:

  • Unsafe接口僅供Netty內部使用,任何方法都不應該被user調用,甚至這個接口都不應該被user知道

發佈了61 篇原創文章 · 獲贊 72 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章