1. 程式人生 > 其它 >Netty--第一章(NIO基礎)

Netty--第一章(NIO基礎)

1. 三大元件簡介

ChannelBuffer

Java NIO系統的核心在於:通道(Channel)和緩衝區(Buffer)。通道表示開啟到 IO 裝置(例如:檔案、套接字)的連線。若需要使用 NIO 系統,需要獲取用於連線 IO 裝置的通道以及用於容納資料的緩衝區。然後操作緩衝區,對資料進行處理

簡而言之,通道負責傳輸,緩衝區負責儲存

常見的Channel有以下四種,其中FileChannel主要用於檔案傳輸,其餘三種用於網路通訊

FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
Buffer有以下幾種,其中使用較多的是ByteBuffer

ByteBuffer
MappedByteBuffer
DirectByteBuffer
HeapByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer

1. 1、Selector

在使用Selector之前,處理socket連線還有以下兩種方法

使用多執行緒技術

為每個連線分別開闢一個執行緒,分別去處理對應的socke連線

這種方法存在以下幾個問題

  • 記憶體佔用高
  • 每個執行緒都需要佔用一定的記憶體,當連線較多時,會開闢大量執行緒,導致佔用大量記憶體
  • 執行緒上下文切換成本高
  • 只適合連線數少的場景
  • 連線數過多,會導致建立很多執行緒,從而出現問題
  • 使用執行緒池技術

1. 2、使用執行緒池,讓執行緒池中的執行緒去處理連線

這種方法存在以下幾個問題

  1. 阻塞模式下,執行緒僅能處理一個連線
  2. 執行緒池中的執行緒獲取任務(task)後,只有當其執行完任務之後(斷開連線後),才會去獲取並執行下一個任務
  3. 若socke連線一直未斷開,則其對應的執行緒無法處理其他socke連線
  4. 僅適合短連線場景
  5. 短連線即建立連線傳送請求並響應後就立即斷開,使得執行緒池中的執行緒可以快速處理其他連線

1. 3、使用選擇器

selector 的作用就是配合一個執行緒來管理多個 channel(fileChannel因為是阻塞式的,所以無法使用selector),獲取這些 channel 上發生的事件,這些 channel 工作在非阻塞模式下,當一個channel中沒有執行任務時,可以去執行其他channel中的任務。適合連線數多,但流量較少的場景

若事件未就緒,呼叫 selector 的 select() 方法會阻塞執行緒,直到 channel 發生了就緒事件。這些事件就緒後,select 方法就會返回這些事件交給 thread 來處理