bindFuture中的channel

今天在看一个Netty框架的源码时,看到了如下的代码:

1
2
3
4
5
6

Channel channel = serverBootstrap.bind()
        .sync()
        .channel();
ALL_CHANNELS.add(serverChannel);

ALL_CHANNELS变量的作用是收集所有的Channel对象,然后在服务器关闭的时候一一关闭这些对象(这样貌似可以提供一定的扩展性,比如在关闭前一一通知到各个客户端服务器关闭的原因,方便客户端进行日志,但是我没有看到这样的应用)。

我所担心的是此时的channel并非绑定后的channel,我之所以有这样的担忧是因为我忘记了bind时仍然仅只有NioServerSocketChannel可用,所以此时是绝对不存在另一个可用的channel的;其次在原生的NIO中也是存在先创建channel,再进行绑定的用法的:

1
2
3
4
5
6

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(7000));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

但是我觉得这种写法还是存在一定的问题,我比较中意下面的这种写法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

// 监听服务器
ChannelFuture bindFuture = serverBootstrap.bind(nettyConfig.getSocketAddress()).sync();
bindFuture.addListener((ChannelFutureListener) future -> {
    if (future.isSuccess()) {
        log.info("Bind Success On {}", nettyConfig.getPortNumber());
        allChannels.add(future.channel());
    }
});