目录
- 通道与Reactor线程组-  这里主要是涉及的是服务器端。 -  服务器端,一般有设置两个线程组,监听连接的 parent channel 工作在一个独立的线程组,这里名称为boss线程组(有点像负责招人的包工头)。 -  连接成功后,负责客户端连接读写的 child channel 工作在另一个线程组,这里名称为 worker 线程组,专门负责搬数据(有点儿像搬砖)。  - Channel 通道的类型-  除了 TCP 协议以外, Netty 还支持很多其他的连接协议, 并且每种协议还有 NIO(异步 IO) 和 OIO(Old-IO, 即传统的阻塞 IO) 版本的区别。 - 不同协议不同的阻塞类型的连接都有不同的 Channel 类型与之对应,下面是一些常用的 Channel 类型:- NioSocketChannel, 代表异步的客户端 TCP Socket 连接.
- NioServerSocketChannel, 异步的服务器端 TCP Socket 连接.
- NioDatagramChannel, 异步的 UDP 连接
- NioSctpChannel, 异步的客户端 Sctp 连接.
- NioSctpServerChannel, 异步的 Sctp 服务器端连接.
- OioSocketChannel, 同步的客户端 TCP Socket 连接.
- OioServerSocketChannel, 同步的服务器端 TCP Socket 连接.
- OioDatagramChannel, 同步的 UDP 连接
- OioSctpChannel, 同步的 Sctp 服务器端连接.
- OioSctpServerChannel, 同步的客户端 TCP Socket 连接.
 - 启动器初步介绍- Bootstrap 是 Netty 提供的一个便利的工厂类,可以通过它来完成 Netty 的客户端或服务器端的 Netty 初始化。 - 当然,Netty 的官方解释说,可以不用这个启动器。 - 但是,一点点去手动创建channel 并且完成一些的设置和启动,会非常麻烦。还是使用这个便利的工具类,会比较好。 - 有两个启动器,分别应用在服务器和客户端。 - 如下图:  - 两个启动器大致的配置,都是相同的。 - 下面以服务器serverBootstrap 启动类为主要的介绍对象。 - 图解 Bootstrap执行流程-  首先,创建了一个引导器 ServerBootstrap 实例,这个专门用于引导服务端的启动工作,直接new 创建即可。(客户端的引导器差不多,不过是创建Bootstrap 实例) - // 启动引导器 private static ServerBootstrap b = new ServerBootstrap();-  启动一个Bootstrap,大致有8步,如下图:  - 代码如下: - try { //1 设置reactor 线程 b.group(bossLoopGroup, workerLoopGroup); //2 设置nio类型的channel b.channel(NioServerSocketChannel.class); //3 设置监听端口 b.localAddress(new InetSocketAddress(port)); //4 设置通道选项 b.option(ChannelOption.SO_KEEPALIVE, true); b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); //5 装配流水线 b.childHandler(new ChannelInitializer<SocketChannel>() { //有连接到达时会创建一个channel protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ProtobufDecoder()); ch.pipeline().addLast(new ProtobufEncoder()); // pipeline管理channel中的Handler // 在channel队列中添加一个handler来处理业务 ch.pipeline().addLast("serverHandler", serverHandler); } }); // 6 开始绑定server // 通过调用sync同步方法阻塞直到绑定成功 ChannelFuture channelFuture = b.bind().sync(); LOGGER.info(ChatServer.class.getName() + " started and listen on " + channelFuture.channel().localAddress()); // 7 监听通道关闭事件 // 应用程序会一直等待,直到channel关闭 ChannelFuture closeFuture= channelFuture.channel().closeFuture(); closeFuture.sync(); } catch (Exception e) { e.printStackTrace(); } finally { // 8 优雅关闭EventLoopGroup, // 释放掉所有资源包括创建的线程 workerLoopGroup.shutdownGracefully(); bossLoopGroup.shutdownGracefully(); }-  接下来就是精彩的8个步骤。 
