Netty源码分析(一)—服务端初始化
传统Java NIO在服务端启动时会涉及到ServerSocketChannel,Selector,selectorKey等类;Netty对Java NIO基础类进行了封装,减少用户开发工作量,降低开发难度;
个人主页:tuzhenyu’s page
原文地址:Netty源码分析(一)—服务端初始化
(0) 服务端初始化
服务端初始化的步骤
创建ServerBootstrap启动辅助类,通过Builder模式进行参数配置;
创建并绑定Reactor线程池EventLoopGroup;
设置并绑定服务端Channel通道类型;
绑定服务端通道数据处理器责任链Handler;
绑定并启动监听端口;
服务端初始化实例
public class TimeServer {
private void bind(int port){
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try{
ServerBootstrap b= new ServerBootstrap();
b.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG,1024)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new TimeServerHandler());
}
});
ChannelFuture f = b.bind(port).sync();
f.channel().closeFuture().sync();
} catch (Exception e){
e.printStackTrace();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args) {
new TimeServer().bind(8008);
}
}
(1) ServerBootstrap初始化
- ServerBootstrap是netty启动辅助类,通过Builder模式进行参数设置初始化;ServerBootstrap继承AbstracBootstrap类,需要对EventLoopGroup,Channel和ChannelHandler等参数进行配置;
public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> {
private final Map<ChannelOption<?>, Object> childOptions = new LinkedHashMap();
private final Map<AttributeKey<?>, Object> childAttrs = new LinkedHashMap();
private final ServerBootstrapConfig config = new ServerBootstrapConfig(this);
private volatile EventLoopGroup childGroup;
private volatile ChannelHandler childHandler;
}
- ServerBootstrap比其父类AbstractBootstrap多出四个part需要进行设置
(2) EventLoop线程池初始化
- EventLoopGroup初始化是创建创建两个NioEventLoopGroup类型的Reactor线程池bossGroup和workGroup分别用来处理客户端的连接请求和通