Netty框架之Netty组件及其作用
说到Netty组件的作用,不得不从Netty的客户端或服务端创建流程分析,请看下面服务端的代码
public static void main(String[] args) {
//serverBootstrap,就是服务端启动器,启动服务端,并且绑定组件
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap
//设置NIOEventLoopGroup包含一组NIOEventLoop,NIOEventLoop其实就是一个单线程(维护Selector,处理channel的请求)
//这里我们设置两个NIOEventLoopGroup,一个充当Boss专门处理连接请求,一个充当Woker专门处理IO读写请求
.group(new NioEventLoopGroup(),new NioEventLoopGroup())
//设置通道类型服务端就是NioServerSocketChannel,客户端是NioSocketChannel
.channel(NioServerSocketChannel.class)
//这里设置的就是Woker(child)的处理器,也就是IO读写的具体实现
.childHandler(new ChannelInitializer<NioSocketChannel>() {
//初始化处理器,处理器用于IO处理的具体实现,把多个处理器加入到pipeline中形成一条处理器连,线程会一次执行这些处理器来完成指定的IO操作
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
ChannelPipeline pipeline = nioSocketChannel.pipeline();
pipeline.addLast(new StringDecoder());//解析器,收到Bytebuffer数据解析成字符串
pipeline.addLast(new ChannelInboundHandlerAdapter() {//自定义处理器
//当收到数据的时候会触发这个方法
@Override
public void channelRead(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {
System.out.println(msg);//输出收到的数据
}
});
}
})
.bind(8080);//绑定服务器的监听端口
}
1.ServerBootStrap
服务端启动器,用于启动服务端程序,并且绑定服务端需要的各个Netty组件,包括(NioEventLoopGroup,Channel,Handler等等)
2.group(new NioEventLoopGroup())
用于绑定创建NioEventLoopGroup(),这个NioEventLoopGroup()事件循环组可以包含了一组NioEventLoop,NioEventLoop是一个事件轮询其,本质是一个单线程维护了一个Selector,当有Channel建立的时候会调用register注册到其中一个NioEventLoop中,那么该Channel的所有IO事件都交由此NioEventLoop来处理
3.channel()
指定通道的类型,服务端通道对应NioServerSocketChannel,客户端对应ServerSocketChannel
4.ChildHandler和Handler
boss线程组用于处理连接请求,woker线程组用于处理IO读写请求,Handler对应的就是boss线程组的处理器,ChildHandler对应的就是woker的处理器,如何处理IO读写的具体实现,需要自己根据需求实现细节,如下代码所示
//这里设置的就是Woker(child)的处理器,也就是IO读写的具体实现
.childHandler(new ChannelInitializer<NioSocketChannel>() {
//初始化处理器,处理器用于IO处理的具体实现,把多个处理器加入到pipeline中形成一条处理器连,线程会一次执行这些处理器来完成指定的IO操作
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
ChannelPipeline pipeline = nioSocketChannel.pipeline();
pipeline.addLast(new StringDecoder());//解析器,收到Bytebuffer数据解析成字符串
pipeline.addLast(new ChannelInboundHandlerAdapter() {//自定义处理器
//当收到数据的时候会触发这个方法
@Override
public void channelRead(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {
System.out.println(msg);//输出收到的数据
}
});
}
})
5.ChannelPipeline
用于形成处理器连,处理IO请求的处理器可能不止一个,例如我需要将收到Byte类型的数据转码为String类型,那么我需要一个解码器,解码之后我需要输出这个String数据,那么需要自定义一个处理器,那么这些处理器都需要一个一个执行,那么此时我们可以把这些处理器加到ChannelPipeline中,他回帮我们按照这个ChannelPipeline中处理器的顺序全部执行一次,完成对数据的整个处理,形象的理解为给你一些食材,你需要很多到工序去把它做成美食,这就是ChannelPipeline的作用