导论
前面几篇文章我们分别对一、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依赖。
<!-- netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>5.0.0.Alpha2</version>
</dependency>
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<NioSocketChannel>() {
@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:\Users\Administrator>nc 127.0.0.1 8080
111111
111111
2.nc客户端1打印(Windows-nc命令打印)
C:\Users\Administrator>nc 127.0.0.1 8080
222
222
往期文章链接
二、网络IO原理-创建ServerSocket-彻底弄懂IO
三、JAVA中ServerSocket调用Linux系统内核
六、Selector实现Netty中Reactor单线程模型
七、Selector实现Netty中Reactor主从模型
如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒
如果需要后续其他系列文章请赞赏后关注私聊。