标签:并且 读取 断点调试 sel image ges serve 管理 tail
1.Netty是在哪里检测有新连接接入的?
答:boss线程的第一个过程轮训处Accept事件,然后boss线程第二个过程通过jdk底层的channel的accept方法创建该连接。
2.新连接是怎样注册到NioEventLoop线程的?
答:新连接NioEventLoop的分配和selector注册可以回答。boss线程调用chooser的next方法,拿到一个NioEventLoop,然后将这条连接注册到NioEventLoop的selector上面。
(1)检测新连接:新连接通过服务端Channel绑定的Selector轮询出Accept事件
(2)创建NioSocketChannel:基于jdkNio的channle创建出一个netty的NioSocketChannel,也就是客户端Channel
(3)分配线程及注册selector:netty给客户端Channel分配一个NioEventLoop,并且把这条Channel注册到该NioEventLoop对应的selector上,至此这条Channel后续的读写都由此NioEventLoop进行管理
(4)向selector注册读事件:注册的过程和服务端启动注册事件复用同一段逻辑。
processSelectedKey(key,channel)[入口]:添加断点
NioMessageUnsafe.read()
doReadMessages()[while循环]
javaChannel().accept()
new NioSocketChannel(parent,ch)[入口]
AbstractNioByteChannel(p,ch,op-read)
configureBlocking(false)&save op
create id,unsafe,pipeline
new NioSocketChannelConfig()
setTcpNoDelay(true)禁止Nagle算法,小的数据包会发出去,降低延迟
服务端Channel的pipeline构成
Head—>ServerBootstrapAcceptor—>Tail
其中ServerBootstrapAcceptor做以下事情:
服务端Channel和客户端Channel的不同点:
(a) 客户端Channel(AbstractNioByteChannel)向AbstractNioChannel注册一个读事件
服务端Channel(AbstractNioMessageChannel)向AbstractNioChannel注册一个accept事件
服务端Channel和客户端Channel共同的部分都由AbstractNioChannel实现
(b) 这两种Channel底层对应的Unsafe不同
客户端Channel对应NioByteUnsafe:读取IO数据
服务端Channel对应NioMessageUnsafe:读一条连接
标签:并且 读取 断点调试 sel image ges serve 管理 tail
原文地址:https://www.cnblogs.com/chanaichao/p/9351488.html