Netty客户端启动后服务端接收消息的流程

Netty客户端启动后服务端接收消息的流程

之前简单讲述了netty服务端启动的流程,客户端启动基本流程一致,今天我们简单介绍下服务端接收客户端发送的消息的过程

1、看下服务端启动和接收客户端连接时pipeline的构建图

在这里插入图片描述

2、客户端启动,处理select中事件

在这里插入图片描述
在这里插入图片描述

2.1、获取unsafe对象,

在这里插入图片描述
此时由于channel是NioServerSocketChannel,所以unsafe对象为NioMessageUnsafe类型
在这里插入图片描述

2.2、调用NioMessageUnsafe的read方法

在这里插入图片描述

2.3、调用doReadMessages

在这里插入图片描述
SocketUtils.accept方法中使用Java NIO的accept方法真正接受建链请求,和客户端建立连接后产生的socketChannel封装成NioSocketChannel,此时创建的unsafe类型为NioSocketChannelUnsafe其父类为NioByteUnsafe,此时构建文章开头的图片中的第二个pipeline对象DefaultChannelPipeline

接2.2图
在这里插入图片描述

3、调用pipeline的扩散消息方法,关注ServerBootstrapAcceptor处理消息方法

在这里插入图片描述

直接将msg强制转换为Channel对象,获取channel中的pipeline(channel和pipeline互相包含的)添加childHandler,最后注册此channel,注册的逻辑和之前一样

客户端channel写入数据时,服务端select继续循环处理事件,
在这里插入图片描述

此时unsafe为NioSocketChannelUnsafe,我们看下其父类的read方法

 protected class NioByteUnsafe extends AbstractNioUnsafe {

       ...
        @Override
        public final void read() {
            final ChannelConfig config = config();
            if (shouldBreakReadReady(config)) {
                clearReadPending();
                return;
            }
            final ChannelPipeline pipeline = pipeline();
            final ByteBufAllocator allocator = config.getAllocator();
            final RecvByteBufAllocator.Handle allocHandle = recvBufAllocHandle();
            allocHandle.reset(config);

            ByteBuf byteBuf = null;
            boolean close = false;
            try {
                do {
                    byteBuf = allocHandle.allocate(allocator);
                    allocHandle.lastBytesRead(doReadBytes(byteBuf));
                    if (allocHandle.lastBytesRead() <= 0) {
                        // nothing was read. release the buffer.
                        byteBuf.release();
                        byteBuf = null;
                        close = allocHandle.lastBytesRead() < 0;
                        if (close) {
                            readPending = false;
                        }
                        break;
                    }
                    allocHandle.incMessagesRead(1);
                    readPending = false;
                    //扩散消息
                    pipeline.fireChannelRead(byteBuf);
                    byteBuf = null;
                } while (allocHandle.continueReading());
                allocHandle.readComplete();
                pipeline.fireChannelReadComplete();
              ...
        }
    }

pipeline.fireChannelRead(byteBuf);最后会调用我们自己写的NettyServerHandler处理msg
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值