在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

handler的执行顺序是怎么样的

162次阅读
没有评论

共计 2426 个字符,预计需要花费 7 分钟才能阅读完成。

本篇内容主要讲解“handler 的执行顺序是怎么样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“handler 的执行顺序是怎么样的”吧!

为了说明这个问题我们增加了 2 个 encoder,分别是 MavlinkMsg2BytesEncoder 和 FixLengthEncoder,作用分别是将一个协议对象转化为 byte 数组,另一个是为了客户端解析的方便,增加了一个定长的设置。
还是按照老方法,设置断点,然后查看其调用顺序。

NettyServerHandler.messageReceived 是我们接收下行消息的终点,我们直接在这里来执行消息的返回。

首先进入 NioSocketChannel.write 方法,下面是代码

@Override
  public ChannelFuture write(Object msg) {
  return pipeline.write(msg);
  }

write 方法定义在 AbstractChannel 当中,是 netty 当中所有的 channel 类的祖先。

在这个方法当中,开始执行依次执行 pipeline 当中的各个 handler

下面是 DefaultChannelPipeline.write 方法

@Override
  public ChannelFuture write(Object msg) {
  return tail.write(msg);
  }

如果没有记错的话,下行的过程当中,是从 head.fireChannelRead 开始的,而在上行的过程当中,是从 tail 开始的,而实际上,head 和 tail 是 pipeline 在初始化的时候默认生成的双向链表的头尾节点,他们并不完成任何实际工作。这里从 tail 开是上行的过程,应该说是非常符合逻辑的。

下一步我们看 DefaultChannelHandlerContext.write 方法

@Override
  public ChannelFuture write(Object msg, ChannelPromise promise) {
  DefaultChannelHandlerContext next = findContextOutbound(MASK_WRITE);
  next.invoker.invokeWrite(next, msg, promise);
  return promise;
  }

这里也是之前我们分析过的代码,查找双向链表当中 prev 节点。

之后是 ChannelHandlerInvokerUtil.invokeWriteNow 方法,

public static void invokeWriteNow(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
  try {
  ctx.handler().write(ctx, msg, promise);
  } catch (Throwable t) {
  notifyOutboundHandlerException(t, promise);
  }
  }

再然后是 MessageToByteEncoder.write 方法,

public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
  ByteBuf buf = null;
  try {
  if (acceptOutboundMessage(msg)) {
  @SuppressWarnings(unchecked)
  I cast = (I) msg;
  if (preferDirect) {
  buf = ctx.alloc().ioBuffer();
  } else {
  buf = ctx.alloc().heapBuffer();
  }
  try {
  encode(ctx, cast, buf);
  } finally {
  ReferenceCountUtil.release(cast);
  }

  if (buf.isReadable()) {
  ctx.write(buf, promise);
  } else {
  buf.release();
  ctx.write(Unpooled.EMPTY_BUFFER, promise);
  }
  buf = null;
  } else {
  ctx.write(msg, promise);
  }
  } catch (EncoderException e) {
  throw e;
  } catch (Throwable e) {
  throw new EncoderException(e);
  } finally {
  if (buf != null) {
  buf.release();
  }
  }
  }

这里分配一个动态缓冲区,然后调用 encoder 方法。

  if (preferDirect) {
  buf = ctx.alloc().ioBuffer();
  } else {
  buf = ctx.alloc().heapBuffer();
  }

请注意这段代码,这里的概念是指,当前缓冲区的分配是从系统 io 当中来分配,还是从 jvm 的堆当中来分配,2 种方式各有利弊,将来我们会专门介绍这个问题。

在最后就是我们的 encode 方法了。

protected void encode(ChannelHandlerContext ctx, MAVLinkMessage msg, ByteBuf out) throws Exception {
     MAVLinkPacket packet = msg.pack();
     byte[] buf = packet.encodePacket();
     out.writeBytes(buf);
   }

而后续的 encoder 的调用过程基本跟前面大同小异。这里就不再赘述了。

到此,相信大家对“handler 的执行顺序是怎么样的”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计2426字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 破了亲妺妺的处免费视频国产 | 加勒比色综合久久久久久久久 | 亚洲欧美人成电影在线观看 | 久久国产香蕉 | 日本一区二区在线 | 欧美色图另类图片 | 国产一区二区在线视频观看 | 无码人妻啪啪一区二区 | 一区二区免费播放 | 天天天干 | 伊人久久成人 | 婷婷综合网 | 国产成人一区二区动漫精品 | 国产精品久久久久免费a∨ 国产精品久久久久免费视频 | 国产精品久久久亚洲 | 色综合久久亚洲国产日韩 | 国产精品无码dvd在线观看 | 国产精品人人爽人人做我的可爱 | 性欧美人与zozoxxxx视频 | www免费在线观看 | 女高中生第一次破苞av | 国产另类ts人妖一区二区 | 欧美日韩一区不卡 | 日韩欧美国产亚洲 | 国产男女自拍视频 | 免费jjzz在在线播放国产成人 | 亚洲精品国产suv一区 | 日本欧美久久久久免费播放网 | 99色在线视频 | 欧美一级高清免费a | 精品热99 | 国产一区二区三区在线视频 | 最新亚洲人成网站在线影院 | 精品免费福利视频 | 国产一起色一起爱 | 精品国产乱码久久久久夜深人妻 | 91手机在线视频 | 国产综合欧美日韩视频一区 | 亚洲av永久无码精品漫画 | 亚洲国产婷婷六月丁香 | 久久99精品久久久久久清纯 |