引入Maven
依赖:
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.49.Final</version> </dependency>
创建服务端代码,启动服务监听:
// 创建Netty服务器启动器,负责组装Netty组件,启动服务器: ServerBootstrap serverBootstrap = new ServerBootstrap(); // 负责接收新连接的线程,主要负责创建新连接: NioEventLoopGroup boss = new NioEventLoopGroup(); // 负责读取数据的线程,主要用于读取数据及业务逻辑处理: NioEventLoopGroup worker = new NioEventLoopGroup(); // boss负责处理连接worker(child)负责处理读写,决定了worker(child)能执行哪些操作(handler) serverBootstrap.group(boss, worker) // 设置Group分组 // 选择服务通道ServerSocketChannel的实现NioServerSocketChannel .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<NioSocketChannel>() { @Override protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception { nioSocketChannel.pipeline().addLast(new StringDecoder()); nioSocketChannel.pipeline().addLast(new SimpleChannelInboundHandler<String>() { @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception { System.out.println(s); } }); } }).bind(8080);
initChannel()
方法,在客户端和服务端连接建立后执行其中定义的代码逻辑。
protected void initChannel(NioSocketChannel nioServerSocketChannel)
把channel
理解为数据的通道,把msg
理解为流动的数据,最开始输入是ByteBuf
,但经过pipeline
的加工,会变成其它类型对象,最后输出又变成ByteBuf
。
把handler
理解为数据的处理工序。工序有多道,台在一起就是pipeline
,pipeline
负责发布事件(读、读取完成.)传播给每个handler
,handler
对自己感兴趣的事件进行处理(重写了相应事件处理方法)。handler
分Inbound
和Outbound
两类
把eventloop
理解为处理数据的工人。工人可以管理多个channel
的io
操作,并且一旦工人负责了某个channel
,就要负责到底(绑定)。工人既可以执行io
操作,也可以进行任务处理,每位工人有任务队列,队列里可以堆放多个channel
的待处理任务,任务分为普通任务、定时任务。工人按照pipeline
顺序,依次按照handler
的规划(代码)处理数据,可以为每道工序指定不同的工人。