Netty基本介紹,參考 https://juejin.cn/post/7408844429370834954
1、Netty構建連接
構建連接的流程
1.1 我們知道客户端連接服務端都是通過NioEventLoop來處理請求,NioEventLoop是一個線程,連接進來首先進入run()方法。
所以我們需要啓動服務端,然後再啓動客户端發起連接,我們在run()方法打個斷點看一下。
從run()方法進入processSelectedKeys方法,如下圖:
processSelectedKeys有一個優化,在selectedKeys為空的時候,調用Optimized方法,這個方法做了優化,性能更好,我們進入Optimized方法
1.2 processSelectedKeysOptimized
首先看key關聯的是否是AbstractNioChannel,進入processSelectedKey
1.3 NioEventLoop#processSelectedKey
readyOps是什麼?
是key當前需要處理的事件(READ、WRITE、CONNECT、ACCEPT)
1.4 當readyOps=16(10000)的時候,處理READ和ACCEPT事件
如下圖,此時的unsafe是AbstractNioMessageChannel$NioMessageUnsafe類,進入其read方法
1.5 進入AbstractNioMessageChannel.NioMessageUnsafe#read
(AbstractNioMessageChannel <---繼承自--- NioServerSocketChannel),繼續進入doReadMessages方法
1.6 doReadMssages,這裏面創建鏈接,繼續進入accept
1.7 accept創建連接並返回SocketChannel,這裏調用了JDK的方法
這裏建立連接,並返回SocketChannel
總結
從前面的源碼分析文章我們知道NioEventLoop是處理請求的線程,通過Selector獲取事件,當它收到READ、ACCEPT事件的時候會去構建連接,通過JDK構建連接。