今天在看一个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());
}
});
|