对于netty的理解,首先要熟悉NIO相关的概念,可以参考学习这里:Java NIO
以NioServerSocket实现为例,netty的启动过程分析:
netty的启动入口,我们一般会这样配置:
ChannelFactory serverChannelFacory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool());
ServerBootstrap bootstrap = new ServerBootstrap(serverChannelFacory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("handler", new YourHandler());
return null;
}
});
bootstrap.bind(new InetSocketAddress(8080));//启动入口
很明显,入口自然就是bootstrap.bind(),bind方法内会处理下面一部分主要的操作
public Channel bind(final SocketAddress localAddress) {
......
ChannelHandler binder = new Binder(localAddress, futureQueue);
ChannelHandler parentHandler = getParentHandler();
ChannelPipeline bossPipeline = pipeline();
bossPipeline.addLast("binder", binder);
if (parentHandler != null) {
bossPipeline.addLast("userHandler", parentHandler);
}
Channel channel = getFactory().newChannel(bossPipeline);
......
}
getFactory()获取的自然是我们前面new ServerBootStrap时的参数NioServerSocketChannelFactory对象,newChannel()的操作是new一个NioServerSocketChannel的对象并返回,传的参数是前面的bossPipeline。所以可以理解这个是针对boss线程的pipeline操作,对应的handler只有binder
NioServerSocketChannel(
ChannelFactory factory,
ChannelPipeline pipeline,
ChannelSink sink) {
super(factory, pipeline, sink);
try {
socket = ServerSocketChannel.open();
} catch (IOException e) {
<