Netty3.X 源码: https://download.youkuaiyun.com/download/netcobol/10309152
ServerBootstrap.bind(new InetSocketAddress(port))
bind 将调用ServerBootstrap.bindAsync 方法,完成初始化 nio ServerSocketChannel,
Binder通过ChannelPipeline.addLast()添加到Pipeline中,如何触发Pipeline?;
Binder 是一个 SimpleChannelUpstreamHandler 其中关键方法是
public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e)
根据不同的ChannelEvent,匹配不同的业务操作,这里重点关注
如果 e 是一个 ChannelStateEvent,同时 status == OPEN
将会调用channelOpen方法,可以通过子类实现具体的操作。
Binder 的 channelOpen 方法:
通过event 获取 Channel (ServerSocketChannel)
evt.getChannel().bind(localAddress)
触发Pipeline:
Channel channel = getFactory().newChannel(bossPipeline);
通过Factory的 NioServerSocketChannelFactory.newChannel 触发Pipeline
public ServerSocketChannel newChannel(ChannelPipeline pipeline) {
return new NioServerSocketChannel(this, pipeline, sink, bossPool.nextBoss(), workerPool);
}
构建 NioServerSocketChannel 类
初始化 ServerSocketChannel.open() 与 socket.configureBlocking(false);
最后调用Channels.fireChannelOpen(this),当Open Server Socket Channel;
StatusEvent: ChannelState.OPEN value: Boolean.TRUE
channel.getPipeline().sendUpstream(new UpstreamChannelStateEvent(channel, ChannelState.OPEN, Boolean.TRUE));
然后 调用 NioServerSocketChannel.bind方法 (AbstractChannel),主要发送bind event
public ChannelFuture bind(SocketAddress localAddress) {
return Channels.bind(this, localAddress);
}
Channels.bind() DownstreamChannelStateEvent status bound value: address
channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent(channel, future, ChannelState.BOUND, localAddress));
由于PiplelineChannel sendDownstream 方法中
如果getActualDownstreamContext 没有Downstream next (header 到头了)
将调用sink.eventSunk方法
NioServerSocketPipelineSink. eventSunk 方法
Channel channel = e.getChannel();
if (channel instanceof NioServerSocketChannel) {
handleServerSocket(e);
} else if (channel instanceof NioSocketChannel) {
handleAcceptedSocket(e);
}
当 Channel == NioServerSocketChannel
Event Status:BOUND
((NioServerBoss) channel.boss).bind(channel, future, (SocketAddress) value);
NioServerBoss.bind 方法
registerTask(new RegisterTask(channel, future, localAddress)) 其中 RegisterTask run 方法
channel.socket.socket().bind(localAddress, channel.getConfig().getBacklog()); bind port
call Channels.fireChannelBound()
channel.getPipeline().sendUpstream(new UpstreamChannelStateEvent(channel, ChannelState.BOUND, localAddress))
channel.socket.register(selector, SelectionKey.OP_ACCEPT, channel)
NioServerBoss.process 方法
registerAcceptedChannel(channel, acceptedSocket, thread)
NioWorker worker = NioServerSocketChannel.workerPool.nextWorker();
worker.register(new NioAcceptedSocketChannel(parent.getFactory(), pipeline, parent, sink, acceptedSocket,
worker, currentThread), null);
NioAcceptedSocketChannel 构造器 调用 Channels.fireChannelOpen(this); Channel:SocketChannel
channel.getPipeline().sendUpstream(new UpstreamChannelStateEvent(channel, ChannelState.OPEN, Boolean.TRUE));
NioWorker.register 方法
Runnable task = createRegisterTask(channel, future);
createRegisterTask 方法
new RegisterTask((NioSocketChannel) channel, future, server);
RegisterTask 构造器
channel.channel.configureBlocking(false);
channel.channel.register( selector, channel.getInternalInterestOps(), channel);
UML 图解说

所有源码下载 :https://download.youkuaiyun.com/download/netcobol/10308871