Bootstrap和ServerBootstrap是Netty提供的一个创建客户端和服务端的一个启动器,主要作用是配置整个Netty程序,串联各个组件。
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workGroup = new NioEventLoopGroup();
ServerBootstrap serveBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workGroup)//设置两个线程组
.channel(NioServerSocketChannel.class)//NioServerSocketChannel服务器通道
.option(ChannelOption.SO_BACKLOG, 128)//线程队列得到的连接个数
.childOption(ChannelOption.SO_KEEPALIVE, true)//设置保持活动连接状态
.childHandler(new ChannelInitializer<SocketChannel>() {
//创建通道测试对象
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new NettyServerHandler());
}
});
ServerBootstrap创建启动器的步骤以及常用的方法为:
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup);
该方法用于服务端设置两个EventLoopGroup;
bossGroup:用于监听客户端连接,负责与客户端创建连接,并把连接注册到WorkerGroup的Selector中
public B channel(Class<? extends C> channelClass);
该方法用来设置一个服务器端的通道实现,建立连接后,根据这个设置创建对应的Channel实例。
常用的通道类型有:
NioServerSocketChannel:异步非阻塞的服务器端TCP Socket连接。
NioSocketChannel:异步非阻塞的客户端TCP Socket连接。
public <T> B option(ChannelOption<T> option, T value);
设置服务端用于接收进来的连接,也就是BossGroup
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value);
是提供给父管道接收到的连接,也就是workerGroup线程。
public ServerBootstrap childHandler(ChannelHandler childHandler);
该方法用于设置业务处理类(自定义的handler),该方法需要初始化通道,实例化一个ChannelInitializer,这时候需要重写
initChannel()方法,进行装配流水线。自定义的handler就是具体的处理请求的处理器。
public ChannelFuture bind(int inetPort);
用于绑定端口,默认是异步启动,加上sync()方法则是同步。
ChannelFuture closeFuture();
最终关闭听到释放资源。
Netty中的所有IO操作都是异步的,不能立刻得到消息是否被正确处理。但是过一会等它执行完成或者直接注册一个监听,具体的实现就是通过Future和ChannelFuture,他们可以注册一个监听,当执行成功或者失败时监听会自动触发注册的监听事件。
常见的方法:
Channel channel(),返回当前正在进行IO操作的通道。
ChannelFuture sync(),等待异步操作执行完毕。
Netty中的Selector和NIO中的Selector是一样的,就是用于监听事件,管理注册到Selector中的channel,实现多路复用。
在介绍Channel时,我们可以知道咋Channel中装配ChannelHandler流水线处理器,一个channel可以有多个处理器,并且是有顺序的。pipeline相当于处理器的容器。初始化时,把ChannelHandler按顺序装在pipeline中,按顺序执行ChannelHandler。
有个Channel中只有一个ChannelPipeline。在Channel创建时创建。
ChannelHandlerContext可以用来获取channel、pipeline等对象,进行读写操作
Netty提供一个专门用来操作缓冲区(Netty的数据容器)的工具类