手把手教你調試Netty創建連接流程源碼

2020-12-27 JavaEdge

設為「星標」,好文章不錯過!

boss thread

NioEventLoop 中的 selector輪詢創建連接事件 (ОР_АССЕРT)創建 socket channel初始化 socket channel 並從 worker group 中選擇一個 NioEventLoopworker thread

將socket channel註冊到選擇的NioEventLoop的selector註冊讀事件(OP_ READ)到selector 上接收連接請求的處理本質是對 OP_ACCEPT 的處理,即在 NioEventLoop 中,因為註冊到了NioEventLoop的 selector。分別調試啟動 EchoServer 和 EchoClient

跳至對應 handler

當前為 bosseventloop,不是 workereventloop

所以這裡 false,又來到註冊

創建完連接後了,已經可以開始接收數據了,即準備讀數據了

最後觀察下 server 的日誌信息

前5行都是服務啟動,後面的就是為了創建連接服務啟動過程多了個 bind 過程,且只綁定了一個接口,而對於下面的創建連接過程它有兩個埠:客戶端埠+server 監聽的埠,這就是 socketChannel接收連接的核心代碼

// 阻塞輪詢。非阻塞輪詢。超時等待輪詢selector.select()/ selectNow()/select(timeoutMillis) 發現 OP_ACCEPT 事件,處理:SocketChannel socketChannel = serverSocketChannel.accept()selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);selectionKey.interestOps(OP_READ);

創建連接的初始化和註冊是通過pipeline.fireChannelRead在ServerBootstrapAcceptor中完成

第一次Register並非監聽OP_READ,而是0

selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this)

最終監聽OP_READ是通過"Register"完成後的fireChannelActive(io.netty.channel.AbstractChannel.AbstractUnsafe#register0)觸發

Worker’s NioEventLoop是通過Register操作執行來啟動。

接受連接的讀操作,不會嘗試讀取更多次(16次)。因為無法知道後續是否還有連接,不可能一直嘗試。

相關焦點

  • Netty 實戰:如何實現文件伺服器?
    ;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.handler.stream.ChunkedFile;public class FileServerHandler extends SimpleChannelInboundHandler { @Override public void channelActive
  • Java-徹底弄懂netty-程式設計師先從簡單例子開啟netty編程-知識鋪
    不佔太多時間,不停的來喚醒你記憶深處的知識點。一、回顧Nio編程1.1 創建ServerSocketChannel。1.2 設置非阻塞模式。1.3 綁定埠,開始監聽TCP連接。1.4 創建處理I/O線程。1.5 創建Selector,把ssc註冊到Selector。1.6 開始接等待客戶端連接 ssc.accept。1.7 啟動I/O線程,while循環中輪詢channel狀態。
  • 敖C肝了一個月的Netty知識點
    高能預警,本文是我一個月前就開始寫的,所以內容會非常長,當然也非常硬核,dubbo源碼系列結束之後我就想著寫一下netty系列的,但是netty的源碼概念又非常多,所以才寫到了現在。Netty處理引導的方式是使你的應用程式和網絡層相隔離。 Bootstrap 是客戶端的引導類,Bootstrap 在調用 bind()(連接UDP)和 connect()(連接TCP)方法時,會新創建一個 Channel,僅創建一個單獨的、沒有父 Channel 的 Channel 來實現所有的網絡交換。
  • Netty 實現原理淺析
    subReactor負責多路分離已連接的socket,讀寫網 絡數據,對業務處理功能,其扔給worker線程池完成。通常,subReactor個數上可與CPU個數等同。成員,當解析數據包發現數據不完整時就終止此次處理流程,等下次讀事件觸 發時接著上次的數據繼續解析。
  • 華為應用市場總架構師超神之作:用19個案例透解Netty
    前言讀者評價:實際上,本書更像是以 netty 作為參考,闡述了構建一個高性能通信框架的主要考量(當然,也講了 netty 的一些坑);第一,是線程模型,兩方面:Netty 採用了傳統的 reactor 模式,利用 boss event
  • Netty學習和進階策略
    《Netty 進階之路》、《分布式服務框架原理與實踐》作者李林鋒手把手教你 Netty 框架如何學習和進階。李林鋒此後還將在 InfoQ 公眾號上開設 Netty 專題持續出稿,感興趣的同學可以持續關注。
  • 手把手教你如何創建雲資料庫
    目的 最近不少人反饋在使用RDS的過程中會發現一些坑,今天就來手把手教你如何創建雲資料庫,可以看到軟體左上角有「連接」圖標
  • Android多線程:手把手帶你深入Handler源碼分析(下)
    在之前的文章中,介紹了Handler的定性認知、定量使用、工作原理和部分源碼分析,具體請看:Android多線程:Handler定性認知Android多線程:Handler使用教程Android多線程:圖文解析Handler工作原理Android多線程:手把手帶你深入Handler源碼分析(上)
  • word怎麼創建模板 手把手教你用WORD創建模板
    word怎麼創建模板 手把手教你用WORD創建模板時間:2017-06-13 13:27   來源:三聯   責任編輯:沫朵 川北在線核心提示:原標題:word怎麼創建模板 手把手教你用WORD創建模板 關於word怎麼創建模板的方法的問題解答 word創建模板方法一: 步驟一:首先打開word,根據需要製作一個
  • 手把手教你如何禁用腳本調試
    手把手教你如何禁用腳本調試時間:2018-03-27 07:56   來源:三聯   責任編輯:沫朵 川北在線核心提示:原標題:電腦總彈出腳本調試器怎麼破? 手把手教你如何禁用腳本調試 有習慣使用IE瀏覽器的朋友們經常會遇到瀏覽網頁時總是彈出腳本調試器選擇窗口,如果不解決的話一直這樣就會非常的煩人。
  • 使用visual studio 對mysql進行源碼級調試
    講故事上一篇說了mysql的架構圖,很多同學反饋說不過癮,畢竟還是聽我講故事,那這篇就來說一說怎麼利用visual studio 對 mysql進行源碼級調試,畢竟源碼面前,不談隱私,聖人面前,皆為螻蟻。二:工具合集mysql是C++寫的,要想在windows上編譯,還需要下載幾個必備小工具。
  • Netty責任鏈Pipeline詳解
    一起說說Netty責任鏈,責任鏈這塊是netty運行機制的核心,一起來完整的了解下netty的責任鏈。 (一)責任鏈模式 介紹 責任鏈模式(Chain of Responsibility Pattern) 為請求創建了一個處理對象的鏈。一個請求過來後,就交給一個責任鏈進行調用。
  • netty writeAndFlush源碼分析
    writeAndFlush,顧名思義,就是寫入(發送緩衝區)並且刷新,熟悉netty編碼的同學對這個方法一定不會感到陌生, 這方法既能將數據寫到發送緩存中
  • 企業微信創建待辦事項圖文教程 手把手教你使用這個功能
    企業微信創建待辦事項圖文教程 手把手教你使用這個功能時間:2018-04-19 12:12   來源:綠茶軟體園   責任編輯:沫朵 川北在線核心提示:原標題:企業微信創建待辦事項圖文教程 手把手教你使用這個功能 1.首先在手機上找到企業微信,點擊進入 2.接著點擊右下角的我,進入到個人主頁 3.然後找到待辦事項
  • 手把手教你寫程序 - 電子技術基礎知識
    手把手教你寫程序:內容:從最簡單的程序入手,手把手教你寫程序,讓同學們拿到一個複雜的程序或者任務,能快速找到切入點,寫出程序,再在此基礎上優化程序。當拿到一個單片機任務時,不要急於動手寫程序,先仔細分析它的以下幾個點:1、它要單片機整體實現什麼功能2、功能細分(模塊化),先幹什麼,再幹什麼,最後幹什麼3、畫初步流程圖,(把幾個模塊畫出即可)4、模塊之間的分析:一個模塊到另一個模塊之間,怎麼變換,怎麼連接(優化流程圖)5、單個模塊分析:每個模塊要做什麼(流程圖細化)
  • 手把手教你如何在VSCode裡調試python
    1.然後,Python擴展創建並打開一個launch.json文件,該文件包含基於您之前選擇的預定義配置,在本例中為Python文件。 您可以修改配置(例如,添加參數),還可以添加自定義配置。更多的配置默認情況下,VS Code僅顯示Python擴展提供的最常見配置。
  • 輔助設計大講堂|08手把手教你用Creo繪製產品連接零件,附帶教學視頻+實例素材
    往期回顧:輔助設計大講堂01|複雜三維實體模型的設計 實例+視頻+素材文件+交流微信群輔助設計大講堂|02 手把手教你用AutoCAD繪製連接件 素材+視頻+微信交流群等你來輔助設計大講堂|03 手把手教你用
  • 用Visual Studio調試Linux程序
    當然如果你說VS2015及以上版本自帶的linux調試插件,那就算了。這些自帶的插件調試一個有簡單的main函數程序還湊合,稍微複雜點的程序,根本無法編譯調試。而本文介紹的主角是VS的另外一款插件Visual GDB,讓我們歡迎主角登場,下面是正文。
  • 程式設計師是如何閱讀源碼的
    調試 React這裡我們先拿 React 舉例,把源碼 clone 下之後,整個人都懵逼了。一般這時候會開始在網上搜文章,如何調試 React 源碼。但是這種大型項目的構建流程較為複雜,如果只是想簡單了解源碼,不需要去了解這些複雜的東西。這裡教大家一個簡單的方案,直接到 CDN 上下載官方編譯好了的開發版源碼(https://cdn.jsdelivr.net/npm/react@17.0.1/umd/react.development.js),中間的版本號可以替換成任何想看的版本。
  • 乾貨 | 前端調試各種收集—斷點篇
    有時候點擊15行斷點選中14行,這是因為瀏覽器真正執行的代碼行不是你看到的那一行,可能是優化掉了或者經過某種轉換。還有的情況是,添加某一行斷點,會跳轉到另一個頁面並命中某一行,這個頁面的背景色是黃色且文件名是VM開頭。上述情況,大部分都是因為瀏覽器顯示的源碼版本,跟真正的源碼文件不一致,只需要刷新一下頁面,保證顯示的源碼是最新的即可。