1、BootStrap介绍
为了方便开发,Netty提供了一系列辅助类,用于把Channel,EventLoop,Handler三个组件快速组装起来完成一个Netty应用,这个系列的类叫做引导类。
- 服务端引导类 ServerBootStrap
- 客户端引导类 BootStrap
BootStrap是Netty提供的一个便利的工厂类,可以通过它来完成Netty客户端或者Netty服务端组件的组装,以及Netty程序的初始化和启动运行。
使用BootStrap类效率更高。
2、BootStrap启动流程
1、创建一个服务端引导类ServerBootstrap serverBootstrap = new ServerBootstrap();
2、为引导类实例设置反应轮询组
也可以不配置两个反应器轮询组,但是会带来风险: 新连接的接收被更加耗时的数据传输或者业务处理阻塞
一般配置两个反应器轮询组,一个负责处理连接监听IO事件,一个负责数据传输事件和处理
NioEventLoopGroup boosLoopGroup = new NioEventLoopGroup();
NioEventLoopGroup workerLoopGroup = new NioEventLoopGroup();
serverBootstrap.group(boosLoopGroup,workerLoopGroup);
3、设置通道的IO类型
Netty支持多种通道类型serverBootstrap.channel(NioServerSocketChannel.class);
4、设置监听端口serverBootstrap.localAddress(new InetSocketAddress(8989));
5、设置传输通道的配置选项
给父通道设置一些有关传输协议的选项serverBootstrap.option(ChannelOption.SO_KEEPALIVE,true);
6、装配子通道的pipline
每个通道都有一条ChannelPipeline流水线,内部有一个双向链表,装配流水线方式为将业务处理器ChannelHandler实例包装后加入双向链表
serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
super.channelRead(ctx, msg);
}
});
}
});
7、绑定服务器新连接的监听端口
通过sync()同步方法阻塞一直到绑定成功ChannelFuture channelFuture = serverBootstrap.bind().sync();
log.info("服务器启动成功,监听端口{}",channelFuture.channel().localAddress());
3、BootStrap使用示例
public class BootStrapClient {
public static void main(String[] args) throws InterruptedException {
Channel channel = new Bootstrap()
.group(new NioEventLoopGroup())
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<NioSocketChannel>() {
//连接建立后调用
@Override
protected void initChannel(NioSocketChannel sc) throws Exception {
sc.pipeline().addLast(new StringEncoder());
}
})
.connect(new InetSocketAddress("localhost", 8989))
//阻塞方法,直至连接建立
.sync()
//代表连接对象
.channel();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String str = scanner.next();
channel.writeAndFlush(str);
}
}
}
public class BootStrapClient {
public static void main(String[] args) throws InterruptedException {
Channel channel = new Bootstrap()
.group(new NioEventLoopGroup())
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<NioSocketChannel>() {
//连接建立后调用
@Override
protected void initChannel(NioSocketChannel sc) throws Exception {
sc.pipeline().addLast(new StringEncoder());
}
})
.connect(new InetSocketAddress("localhost", 8989))
//阻塞方法,直至连接建立
.sync()
//代表连接对象
.channel();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String str = scanner.next();
channel.writeAndFlush(str);
}
}
}