背景
对于netty一直比较好奇,之前看过《Netty权威指南》、《Netty实战》,但是可能因为自己对于netty没有很好的实践感受,才促使自己深入学习,也可能对于没有静下心来,多种原因吧。
新年伊始,刚好年前一段时间对于netty也进去了项目上手,自己也能静下来一行一行阅读源码。
启动Netty服务端代码
public class HelloWorldServer {
private int port;
public HelloWorldServer(int port){
this.port = port;
}
public void start(){
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup worker = new NioEventLoopGroup();
try{
//group指定ServerBootstrap的parentGroup 为bossGroup
//childGroup为woker
ServerBootstrap serverBootstrap = new ServerBootstrap().group(bossGroup, worker)
//channel调用的是ServerBootstrap的父类AbstractBootstrap,作用是初始化serverBootstrap的channelFactory,
// 里面的参数表示以后创建出来的channel为NioServceSocketChannle对象,channel返回的是serverBootstrap对象
.channel(NioServerSocketChannel.class)
//给serverBootstrap初始化localAddress属性
.localAddress(new InetSocketAddress(port))
//初始化childHandler,返回serverBootstrap
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel ch) throws Exception {
// ch.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
ch.pipeline().addLast("decoder", new StringDecoder());
ch.pipeline().addLast("encoder", new StringEncoder());
ch.pipeline().addLast(new HelloWorldServerHandler());
};
})
//给serverBootstrap中的option赋值,方法为AbstractBootstrap中的
//option -->new LinkedHashMap<ChannelOption<?>, Object>();
.option(ChannelOption.SO_BACKLOG, 128)
//给serverBootstrap中childOption赋值,方法为ServerBootstrap中的
//childOption -->new LinkedHashMap<ChannelOption<?>, Object>();
.childOption(ChannelOption.SO_KEEPALIVE, true);
// 绑定端口,开始接收进来的连接
//调用父类AbstractBootstrap中的bind
//bind首先判断group和channelFactory是否为空,根据这个可知,这2个属性为必须的
//最终调用AbstractBootstrap.doBind(localAddress); localAddress为.localAddress方法初始化的
//doBind(final SocketAddress localAddress):
// bind()返回的是DefaultChannelPromise对象
//sync()只是让ChannelFuture挂起
ChannelFuture future = serverBootstrap.bind(port).sync();
System.out.println("Server start listen at " + port );
future.channel().closeFuture().sync();
}catch (Exception ex){
ex.printStackTrace();
}finally {
bossGroup.shutdownGracefully();
worker.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
int port;
if (args.length > 0) {
port = Integer.parseInt(args[0]);
} else {
port = 8080;
}
new HelloWorldServer(port).start();
}
}
这是一个启动Netty服务端的一代码,那么接下来进行一行行分析代码:
首先分析创建group:
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup worker = new NioEventLoopGroup();
根据调用的栈关系,可以看到:
最终进入了MultithreadEventExecutorGroup,