注册interestOps有两种方式:
1.一是register的时候带上参数;
2.另外一种是SelectionKey#interestOps
netty使用的是后者,具体的代码在 AbstractNioChannel#doBeginRead
@Override
protected void doBeginRead() throws Exception {
// Channel.read() or ChannelHandlerContext.read() was called
final SelectionKey selectionKey = this.selectionKey;
if (!selectionKey.isValid()) {
return;
}
readPending = true;
final int interestOps = selectionKey.interestOps();
if ((interestOps & readInterestOp) == 0) {
selectionKey.interestOps(interestOps | readInterestOp);
}
}
对于你描述的场景,其实是NioServerSocketChannel,上面的函数会在bind的时候调用,方法中使用的成员变量interestOps的值会在构造的时候传入:
/**
* Create a new instance using the given {@link ServerSocketChannel}.
*/
public NioServerSocketChannel(ServerSocketChannel channel) {
super(null, channel, SelectionKey.OP_ACCEPT);
config = new NioServerSocketChannelConfig(this, javaChannel().socket());
}
所以,注册的其实是OPS_ACCEPT,即16。
对于普通的Channel也同样是走以上的方式注册。
以上。
ps:这个问题我记得在 gayhub 上有同学提过issues的,还是中文提问的,一时找不到了。