Netty源码-业务流程之构建连接

69 阅读1分钟

Netty基本介绍,参考 juejin.cn/post/740884…

1、Netty构建连接

构建连接的流程

1726846216681.jpg

1.1 我们知道客户端连接服务端都是通过NioEventLoop来处理请求,NioEventLoop是一个线程,连接进来首先进入run()方法。

所以我们需要启动服务端,然后再启动客户端发起连接,我们在run()方法打个断点看一下。 从run()方法进入processSelectedKeys方法,如下图: processSelectedKeys有一个优化,在selectedKeys为空的时候,调用Optimized方法,这个方法做了优化,性能更好,我们进入Optimized方法

1726846252398.jpg

1.2 processSelectedKeysOptimized

首先看key关联的是否是AbstractNioChannel,进入processSelectedKey

1726846257512.jpg

1.3 NioEventLoop#processSelectedKey

readyOps是什么? 是key当前需要处理的事件(READ、WRITE、CONNECT、ACCEPT)

1726846267626.jpg

1.4 当readyOps=16(10000)的时候,处理READ和ACCEPT事件

如下图,此时的unsafe是AbstractNioMessageChannel$NioMessageUnsafe类,进入其read方法

1726846273117.jpg

1.5 进入AbstractNioMessageChannel.NioMessageUnsafe#read

(AbstractNioMessageChannel <---继承自--- NioServerSocketChannel),继续进入doReadMessages方法

1726846278421.jpg

1.6 doReadMssages,这里面创建链接,继续进入accept

1726846286597.jpg

1.7 accept创建连接并返回SocketChannel,这里调用了JDK的方法

这里建立连接,并返回SocketChannel

1726846291605.jpg

总结

从前面的源码分析文章我们知道NioEventLoop是处理请求的线程,通过Selector获取事件,当它收到READ、ACCEPT事件的时候会去构建连接,通过JDK构建连接。