导论
前面几篇文章我们分别对一、JAVA IO/NIO体系介绍 、二、网络IO原理-创建ServerSocket-彻底弄懂IO 、三、JAVA中ServerSocket调用Linux系统内核 、四、「大厂职员教你」IO进化过程之BIO 、五、「大厂职员教你」Java-IO进化过程之NIO 、六、Selector实现Netty中Reactor单线程模型 、七、Selector实现Netty中Reactor主从模型 等几个纬度对JavaIO和NIO体系做了详细介绍,并由简到深的根据IO体系的升级过程做了系统分析。
前文中的第六、Selector实现Netty中Reactor单线程模型 、七、Selector实现Netty中Reactor主从模型文章我们已经使用Selector自己实现了Netty框架中的单线程模型、主从模型。如果能深入理解以上两篇文章,那么后续对于Netty的学习和理解Netty的Reactor会非常简单。今天我们先通过入门的角度从Idea中导入Netty包,并且使用Netty构建一个可用于接受数据的服务端。
IDEA的maven项目的netty包的导入(其他jar同)
在这之前要有搭建好maven的环境,如何搭建maven环境请自行百度。
1.
2.选择Modules
3.
4.等待一会选择,Download to可以不用勾选,下载的jar会放在本地的jar仓库里,如果勾选了则会在该项目下创建一个lib文件,并且将包放里面。
5.
6.选择一个netty包,点击ok,接下来选择即可。
最后选择
7.即可完成。
在该项目的pom.xml里加入netty依赖。
io.nettynetty-all5.0.0.Alpha2
netty入门服务端代码
import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;/** * Created by Bruce on 2020/9/18 * 使用 NettyIO实现多路复用器 **/public class NettyIO { public static void main(String[] args) throws InterruptedException { /** * //单线程模型---netty单线程模型---即接受客户端请求连接也负责处理客户端的数据 * netty单线程模型---写法 * NioEventLoopGroup boss = new NioEventLoopGroup(1); * ServerBootstrap serverBootstrap = new ServerBootstrap(); * serverBootstrap.group(boss,boss) * .channel(NioServerSocketChannel.class) * .childHandler(new MyImbound()); * * * //混合模型---netty混合模型---组内有一个boss即接受客户端请求连接也负责处理客户端的数据,其他线程只负责处理客户端的数据 * netty混合模型---写法 * NioEventLoopGroup boss = new NioEventLoopGroup(4); * ServerBootstrap serverBootstrap = new ServerBootstrap(); * serverBootstrap.group(boss,boss) * .channel(NioServerSocketChannel.class) * .childHandler(new MyImbound()); * * //主备模型---netty主备模型---boss 只负责接口客户端的连接请求 worker负责 * * -----如果这里把 boss的参数改成 2,那么猜一下系统中会有几个线程? * 用JDK自带的jvisualvm看一下。 * * NioEventLoopGroup boss = new NioEventLoopGroup(1); * NioEventLoopGroup worker = new NioEventLoopGroup(3); * ServerBootstrap serverBootstrap = new ServerBootstrap(); * serverBootstrap.group(boss,worker) * .channel(NioServerSocketChannel.class) * .childHandler(new MyImbound()); * */ NioEventLoopGroup boss = new NioEventLoopGroup(1); NioEventLoopGroup worker = new NioEventLoopGroup(3); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(boss,worker) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception { ChannelPipeline p = nioSocketChannel.pipeline(); p.addLast(new MyImbound()); } }); ChannelFuture future = serverBootstrap.bind(8080).sync(); future.channel().closeFuture().sync(); }}class MyImbound extends ChannelHandlerAdapter{ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {// super.channelRead(ctx, msg); ctx.write(msg); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {// super.channelReadComplete(ctx); ctx.flush(); }}
数据打印:
在linux环境或者windows环境下使用nc命令链接服务端,查看服务端打印过程。
具体linux系统或者windows系统如何安装nc命令,请从网络搜索或查看目录文档 ‘网络IO涉及到的-linux指令.docx’。
1.nc客户端1打印(Windows-nc命令打印)
C:甥敳獲Administrator>nc 127.0.0.1 8080111111111111
2.nc客户端1打印(Windows-nc命令打印)
C:甥敳獲Administrator>nc 127.0.0.1 8080222222
往期文章链接
一、JAVA IO/NIO体系介绍
二、网络IO原理-创建ServerSocket-彻底弄懂IO
三、JAVA中ServerSocket调用Linux系统内核
四、「大厂职员教你」IO进化过程之BIO
五、「大厂职员教你」Java-IO进化过程之NIO
六、Selector实现Netty中Reactor单线程模型
七、Selector实现Netty中Reactor主从模型
后续文章中的整体JavaIO体系文章概览