日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

NIO网络模型

發布時間:2025/4/16 85 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NIO网络模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. NIO簡介

NIO:Non-blocking I/O 或 New I/O

  • 從特性出發:非阻塞IO
  • 從年齡出發:新IO,在原始IO之后出現的

誕生:從 JDK 1.4 引入的全新的輸入輸出標準庫,重新設計的一套IO標準

職務:高并發網絡服務器支持崗。作為原始IO的補充,為了應對高性能高并發的應用場景。

2. 編程模型

模型:對事物共性的抽象(個人理解:用一個統一的方法解決一系列相似的問題)

編程模型:對編程共性的抽象(個人理解:用一個統一的編程方法解決一系列相似的問題)

2.1 BIO網絡模型

BIO:Blocking I/O,阻塞IO。

傳統的 BIO 通過socket.read()讀取服務端的數據,如果TCP RecvBuffer里沒有數據,函數會一直阻塞,直到收到數據,返回讀到的數據。


當有很多客戶端訪問服務端,但客戶端未發送數據,服務端線程處于線程阻塞,等待客戶端響應,這樣可能會導致服務端崩潰。

在大量并發的情況下,接入的客戶端過多,會出現問題。

BIO網絡模型的缺點:

  • 阻塞式I/O模型。(服務端必須等待客戶端的再次請求)
  • 彈性伸縮能力差。(客戶端與服務端的線程數時 1:1 的關系)
  • 多線程耗資源(線程創建、銷毀,或大量線程處于服務器端都會使得服務端的CPU調度資源受到影響)

2.2 NIO網絡模型

selector:負責管理與客戶端建立的多個連接,負責監聽注冊到上面的一些事件,如有新連接接入、當前連接上有可讀消息或可寫消息。一旦事件被其監聽到,就會調用對應的事件處理器來完成對事件的響應。

主要功能:接收所有與客戶端socket的連接,并且監聽它們關心的事件,當這個事件發生之后,就會調用相應的事件處理器來處理這個事件。

2.3 NIO網絡模型改進

  • 非阻塞式I/O模型。(服務器端提供一個單線程的Selector來統一管理客戶端socket接入的所有連接,并負責每個連接所關心的事件)
  • 彈性伸縮能力強。(服務器端不再是通過多個線程來處理請求,而是通過一個線程來處理所有請求,對應關系變為 N:1)
  • 單線程節省資源。(線程頻繁創建、銷毀,線程之間的上下文切換等帶來的資源消耗得要緩解)

3. NIO網絡編程詳解

NIO核心類

  • Channel:通道
  • Buffer:緩沖區
  • Selector:選擇器 或 多路復用器

3.1 Channel簡介

3.1.1 Channe特性

(1)雙向性

? Channel是信息傳輸的通道,是 JDK NIO中對輸入輸出方式的另一種抽象,可以類比BIO中的流的概念。但與流不同的是,流是單向傳輸,有InputStream()、OutputStream(),而Channel是雙向傳輸,即可讀,又可寫。

(2)非阻塞性

? Channel可以工作在非阻塞模式下,正是由于這個特性,構成了NIO的基礎。

(3)操作唯一性

? 操作Channel的唯一方式是使用Buffer,通過Buffer操作Channel實現數據塊的讀寫。Buffer本質上就是一個字節數組。

3.1.2 Channel核心實現類
  • 文件類:FileChannel
  • UDP類:DatagramChannel
  • TCP類:ServerSocketChannel / SocketChannel

Socket回顧:

/********** 服務端 **********/// 1. 監聽端口 ServerSocket serverSocket = new ServerSocket(8000); while (true) {// 2. 接收請求,建立連接Socket socket = serverSocket.accept();// 3. 數據交換new Thread(new BIOServerHandler(socket)).start(); } // 4. 關閉資源 serverSocket.close();/********** 客戶端 **********/// 1. 建立連接 Socket socket = new Socket("127.0.0.1", 8000); // 2. 獲取輸入輸出流 InputStream inputStream = socket.getInputStream(); OutputStream outStream = socket.getOutputStream();

Channel使用:

// 代碼片段 1:服務器端通過服務器socket創建channel ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 代碼片段 2:服務器端綁定端口 serverSocketChannel.bind(new InetSocketAddress(8000)); // 代碼片段 3:服務器端監聽客戶端連接,建立socketChannel連接 SocketChannel socketChannel = serverSocketChannel.accept(); // 代買片段 4:客戶端連接遠程主機及端口 SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8000))

3.2 Buffer簡介

? 提供唯一與Channel進行交互的方式。

  • 作用:讀寫Channel中的數據
  • 本質:一塊可以從中讀取或寫入的內存區域。被NIO包裝成一個NIO Buffer對象,并提供一組便于操作內存的方法。
3.2.1 Buffer屬性

(1)Capacity:容量。

標明數組可以容納的最大字節長度,若超出容量,則需要將其清空后才能重新寫入。

(2)Position:位置

寫模式:表示當前的位置,初始位置為0,最大值為 Capacity-1

讀模式:重置為0

(3)Limit:上限

寫模式:最多能往Buffer中寫的數據數量,此時等于Capacity

讀模式:此時等于寫模式下的Position值。

(4)Mark:標記

標記一個特定Position位置,可通過Buffer的Reset()方法恢復到標記位置。

3.2.2 Buffer使用
// 初始化長度為10的byte類型Buffer ByteBuffer.allocate(10);

// 向byteBuffer中寫入三個字節 byteBuffer.put("abc".getBytes(Charset.forName("UTF-8")));

// 將byteBuffer從寫模式切換成讀模式 byteBuffer.flip();

// 從byteBuffer中讀取一個字節 byteBuffer.get();

// 調用mark方法記錄下當前position的位置 byteBuffer.mark();

// 先調用get方法讀取下一個字節 byteBuffer.get() // 再調用reset()方法將position重置到mark位置 byteBuffer.reset()

// 調用clear方法,將所有屬性重置 byteBuffer.clear()

3.3 Selector簡介

Java NIO中能夠檢測1到多個NIO通道,并能夠知曉通道是否為諸如讀寫事件做好準備的組件。由Selector就能通過一個單獨的線程來管理多個Channel,從而管理多個網絡連接。

3.3.1 Selector使用
// 代碼片段 1:創建Selector Selector selector = Selector.open(); // 代碼片段 2:將channel注冊到selector上,監聽讀就緒事件 SelectionKey selectionKey = channel.register(selector, SelectionKey.OP_READ); // 代碼片段 3:阻塞等待channel的就緒事件發生 int selectNum = selector.select(); // 代碼片段 4:獲取發生就緒事件的channel集合 Set<SelectionKey> selectedKeys = selector.selectedKeys();
3.3.2 SelectionKey簡介

(1)四種就緒狀態常量

SelectionKey常量提供了四個可監聽事件的靜態常量值。

  • OP_CONNECT:連接就緒。連接操作,Client端支持的一種操作
  • OP_ACCEPT:接收就緒。連接可接受操作,僅ServerSocketChannel支持
  • OP_READ:讀就緒。
  • OP_WRITE:寫就緒。

(2)可以獲取有價值的屬性

在調用Selector對象的SelectedKey方法時,會返回一個SelectionKey的集合。可以通過這個SelectionKey的集合獲取當前的Channel、當前Selector的對象、Channel已就緒事件集合和所關心事件集合。

總結

以上是生活随笔為你收集整理的NIO网络模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。