netty 的执行流程

该博客详细阐述了Netty服务端从客户端请求到应答的执行流程,包括handlerAdded、channelRegistered、channelActive、channelRead、channelReadComplete和channelInactive等关键步骤。在channelRead方法中可以进行数据流解析和应答处理,而解码顺序问题也可能影响整个流程。文中还给出了ServerBootstrap服务启动类及客户端、服务端处理器的代码示例。
摘要由CSDN通过智能技术生成

       主要讲的是客户端向服务端发起请求,服务器的主要执行过程、解码问题、应答客户端。

执行流程:

  • 最先加载的是服务端的handlerAdded,这个方法基本是super的
  • 其次是channelRegistered,注册用的,这个方法其实也使用super就行无需做改动
  • 第三是channelActive,类似激活,在前面两种方法的执行中比较重要的开始
  • 第四是channelRead,这个是读取流,你可以在这个方法中加入自己对数据流的解析处理,同时也是对客户端做出应答的方法,如果存在自定义编码器,则编码器优先,二channelRead在后面
  • 第五是channelReadComplete,字面理解读取数据流完成,在第四步骤已经处理过了或者继续往下走了
  • 第六是channelInactive,失效,跟第三步骤是层次对应,到这就已经结束一次客户端请,服务端应答

备注:如果在初始化配置的时候,如果解码代码顺序问题也会导致这个顺序问题。

代码如下:

1.ServerBootstrap 服务启动类

 

package netty.NIO;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TimeServer {
    public static void main(String[] args) {
        int port = 9898;
        new TimeServer().bind(port);
    }
    public void bind(int port) {
        /**
         * interface EventLoopGroup extends EventExecutorGroup extends ScheduledExecutorService extends ExecutorService
         * 配置服务端的 NIO 线程池,用于网络事件处理,实质上他们就是 Reactor 线程组
         * bossGroup 用于服务端接受客户端连接,workerGroup 用于进行 SocketChannel 网络读写*/
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            /** ServerBootstrap 是 Netty 用于启动 NIO 服务端的辅助启动类,用于降低开发难度
             * */
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .childHandler(new ChildChannelHandler());
 
            /**服务器启动辅助类配置完成后,调用 bind 方法绑定监听端口,调用 sync 方法同步等待绑定操作完成*/
            ChannelFuture f = b.bind(port).sync();
 
            System.out.println(Thread.currentThread().getName() + ",服务器开始监听端口,等待客户端连接.........");
            /**下面会进行阻塞,等待服务器连接关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值