Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理
首先来一段Netty Server的sample:
ServerBootstrap是一个启动辅助类;
group(bossGroup, workerGroup) 我们需要两种类型的人干活,一个是老板,一个是工人,老板负责从外面接活,接到的活分配给工人干,放到这里,bossGroup的作用就是不断地accept到新的连接,将新的连接丢给workerGroup来处理;
.channel(NioServerSocketChannel.class) 表示服务端启动的是nio相关的channel,可以理解为一条channel就是一个连接;
.handler(new EchoServerHandler()),消息处理器
.childHandler(new ChannelInitializer<SocketChannel>)...表示一条新的连接进来之后,该怎么处理,也就是上面所说的,老板如何给工人配活。
我们带着两个问题来展开本章节的内容:
-
Channel如何被创建的?
-
Selector如何被创建的?
-
如何绑定端口?
ChannelFuture f = b.bind(PORT).sync(),我们主要深入了解bind方法。
AbstractBootstrap#bind->AbstractBootstrap#doBind-->AbstractBootstrap#ReflectiveChannelFactory#initAndRegister中,通过反射创建NioServerSocketChannel.class
用户调用方法 Bootstrap.bind(port) 第一步就是通过反射的方式new一个NioServerSocketChannel对象,并且在new的过程中创建了一系列的核心组件(Channel,ChannelConfig,ChannelId,Unsafe,Pipeline,ChannelHander),真正的启动我们还需要继续跟。
接着看ServerBootstrap#init(Channel channel),这里比较主要的就是把Handler加入到了Pipeline
接着看AbstractBootstrap#ChannelFuture regFuture = config().group().register(channel)把channel注册到EventLoopGroup中去,最终会调用register0
2中的pipeline.invokeHandlerAddedIfNeeded()大概是把自定义的Handler添加到Pipeline中
最后返回到AbstractBootstrap#doBind0进行绑定端口