4.1 服务端启动最小化代码
以下是服务端启动的一个非常精简的Demo。
NettyServer.java
● 上述代码首先创建了两个NioEventLoopGroup,这两个对象可以看作传统IO编程模型的两大线程组,bossGroup表示监听端口,接收新连接的线程组;workerGroup表示处理每一个连接的数据读写的线程组。用生活中的例子来讲就是,一个工厂要运作,必然要有一个老板负责从外面接活,然后有很多员工,负责具体干活。老板就是bossGroup,员工们就是workerGroup,bossGroup接收完连接,交给workerGroup去处理。
● 其次创建了一个引导类ServerBootstrap,这个类将引导服务端的启动工作。
● 通过.group(bossGroup,workerGroup)给引导类配置两大线程组,这个引导类的线程模型也就定型了。
● 然后指定服务端的IO模型为NIO,上述代码通过.channel(NioServerSocketChannel.class)来指定IO模型,也可以有其他选择。如果你想指定IO模型为BIO,那么这里配置上OioServerSocketChannel.class类型即可。当然通常我们也不会这么做,因为Netty的优势就在于NIO。
● 接着调用childHandler()方法,给这个引导类创建一个ChannelInitializer,主要是定义后续每个连接的数据读写,对于业务处理逻辑,不理解也没关系,后面我们会详细分析。在ChannelInitializer这个类中,有一个泛型参数NioSocketChannel,这个类就是Netty对NIO类型连接的抽象,而前面的NioServerSocketChannel也是对NIO类型连接的抽象,NioServerSocketChannel和NioSocketChannel的概念可以与BIO编程模型中的ServerSocket和Socket两个概念对应。
最小化参数配置到这里就完成了,总结一下就是,要启动一个Netty服务端,必须要指定三类属性,分别是线程模型、IO模型、连接读写处理逻辑。有了这三者,之后再调用bind(8000),就可以在本地绑定一个8000端口启动服务端。以上这段代码,读者可以直接复制到自己的IDE中运行。