netty 笔记

使用的 netty 版本是:4.1.30.Final-SNAPSHOT

1. netty 服务端有 boss 线程组和 worker 线程组,经调试发现,boss 线程组处理连接事件,而 worker 线程组处理 IO 读事件,两个线程组的代码是同一份 NioEventLoop,到底在哪对事件进行了区分?

很可能是 :

io.netty.channel.nio.AbstractNioChannel#doRegister

 

2. netty 的 channelPipeline

channelPipeline 添加了各种 ChannelHandler,这些 handler 分为 inbound 和 outbound 两种类型,这些 handler 的执行顺序是怎样的?

io.netty.channel.AbstractChannelHandlerContext#findContextInbound
io.netty.channel.AbstractChannelHandlerContext#findContextOutbound

实际构成链的是 AbstractChannelHandlerContext,有的方法遍历方向是从 head 往后,有的是从 tail 向前。

在自定义 ChannelHandler 的 channelRead 方法中加断点,得到的调用栈如下图:

fireChannelRead,invokeChannelRead,channelRead 构成了递归调用,channelRead 方法中执行 ctx.fireChannelRead 过渡到下一个 handler。netty 从 socket 读取数据,然后按顺序经过 inbound 的 handler。

read data -> inbound 1 -> inbound 2 -> ... -> inbound N
write data -> outbound N -> ... -> outbound 2 -> outbound 1

 

3. write 和 writeAndFlush

ChannelFuture f = b.connect(HOST, PORT).sync();
f.channel().write("1xx");

write 并不会真的发送数据,它只是把数据添加到 ChannelOutboundBuffer 中。

转载于:https://www.cnblogs.com/allenwas3/p/9703021.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值