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事件,這些事件會通過ChannelPipeline被ChannelHandler處理。要想知道事件如何在Pipeline裏傳播,請看這篇文章。
Unsafe接口
Unsafe接口是Channel的一個內部接口,我沒弄明白這個接口的設計意圖,暫時只能根據接口名和Javadoc的說明得出以下結論:
- Unsafe接口僅供Netty內部使用,任何方法都不應該被user調用,甚至這個接口都不應該被user知道