Netty學習記錄-入門篇

你如果 , 緩緩把手舉起來 , 舉到頂,再突然張開五指 , 那恭喜你,你剛剛給自己放了個煙花 。
模塊介紹
  1. netty-bio: 阻塞型網絡通信demo 。
  2. netty-nio: 引入channel(通道)、buffer(緩沖區)、selector(選擇器)的概念,采用事件驅動的方式,使用單個線程就可以監聽多個客戶端通道 , 改進bio模式下線程阻塞等待造成的資源浪費 。
  3. netty-demo: Netty小demo,認識Netty初體驗 。
  4. netty-groupchat: 使用Netty編寫一個群聊系統 。
  5. netty-http: Netty的HTTP調用demo 。
  6. netty-bytebuf: Netty緩沖區使用demo 。
  7. netty-decoder: Netty編解碼,handler調用鏈使用示例 。
  8. netty-idlestate: Netty心跳包使用示例 。
  9. netty-sticking: 自定義協議與handler,解決TCP傳輸粘包與拆包問題 。
  10. netty-rpc: 使用Netty自定義實現RPC通信 。
Demo地址:https://gitee.com/LHDAXIE/netty
netty-bio模塊模擬測試采用socket的bio方式進行網絡通信 。
blocking io同步并阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器就需要啟動一個線程進行處理,如果這個連接不做任何事情就會進入阻塞等待狀態,造成不必要的線程開銷 。
適用于連接數據小且連接固定的系統架構 。
架構示意圖:
Netty學習記錄-入門篇

文章插圖
netty-nio模塊non-blocking io同步非阻塞,在bio的架構上進行改進,引入channel(通道)、buffer(緩沖區)、selector(選擇器)的概念,采用事件驅動的方式 , 使用單個線程就可以監聽多個客戶端通道,改進bio模式下線程阻塞等待造成的資源浪費 。
架構示意圖:
Netty學習記錄-入門篇

文章插圖
關鍵:select會根據不同的事件,在各個channel通道上進行切換 。
緩沖區buffer本質上是一個可以讀寫數據(關鍵)的內存塊,nio的讀取與寫入數據都必須是經過buffer的 。
通道channel把通道看做流、把通道看做流、把通道看做流 , 重要的事情說三遍,會很好理解 。nio引入的通道類似bio中流的概念,不同之處在于:
  • 通道可以同時進行讀寫操作,而流只能讀或者寫
  • 通道可以實現異步讀寫數據
  • 通道可以從緩沖區讀數據,也可以寫數據到緩沖區(雙向的概念)
NIOFileOper01: 本地文件寫數據使用ByteBufferFileChannel,將“hello,李嘉圖”NIOFileOper01.txt文件中 。
NIOFileOper02: 本地文件讀數據使用ByteBuffer(緩沖) 和 FileChannel(通道),將 NIOFileOper01.txt中的數據讀入到程序,并顯示在控制臺屏幕
NIOFileOper03: 使用一個Buffer完成文件讀取使用 FileChannel(通道) 和 方法 read , write,完成文件的拷貝
NIOFileCopy:拷貝文件 transferFrom 方法使用 FileChannel(通道) 和 方法 transferFrom ,完成文件的拷貝
選擇器Selector核心:selector能夠檢測多個注冊的通道上是否有事件發生(多個channel以事件的方式可以注冊到同一個selector),如果有事件發生,便獲取事件然后針對每個事件進行相應的處理 。這樣就可以做到只使用一個單線程去管理多個通道 。
只有在連接/通道真正有讀寫事件發生時,才會進行讀寫,就大大地減少了系統開銷 , 并且不必為每個連接都創建一個線程,不用去維護多個線程 。
原理圖:
Netty學習記錄-入門篇

文章插圖
說明:
  1. 當客戶端連接時,會通過ServerSocketChannel得到SocketChannel 。
  2. Selector進行監聽select方法,返回有事件發生的通道的個數 。
  3. socketChannel注冊到Selector上,register(),一個selector上可以注冊多個SocketChannel 。
  4. 注冊后返回一個selectionKey,會和該selector關聯 。
  5. 進一步得到各個selectionKey(有事件發生) 。

    推薦閱讀