首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java NIO 網路程式設計入門:從阻塞 I/O 到 Selector 多工模式的完整遷移指南

     編輯:Java 相關知識

深入淺出講解 Java NIO 核心三大元件,對比傳統阻塞 I/O 與多執行緒模型缺點,完整實作非阻塞 Echo Client/Server,展示 Selector 事件驅動架構。

為何需要 NIO

  • 傳統 Socket 調用阻塞,大量連線需建立大量執行緒 → 硬體資源耗盡、執行緒切換開銷大、優先級難控制、Client 間交互困難。
  • 單執行緒輪詢非阻塞 I/O → 無法即時回應、CPU 忙碌輪詢。
  • NIO 提供 Selector (多工器):單一執行緒監控成百上千 Channel,只處理就緒事件 (Accept/Read/Write)。

核心三大類別

  • java.nio.channels.Channel:可註冊至 Selector 的 I/O 來源 (檔案/網路)。
  • java.nio.channels.Selector:監控多個 Channel 的就緒事件。
  • java.nio.Buffer:讀寫資料的容器,取代 Stream,可控制緩衝區大小與操作。

非阻塞 Echo Client

SocketChannel clntChan = SocketChannel.open();
clntChan.configureBlocking(false);
// 非阻塞連線
if (!clntChan.connect(new InetSocketAddress(server, port))) {
  while (!clntChan.finishConnect()) { /* 做其他事 */ }
}
ByteBuffer writeBuf = ByteBuffer.wrap(msgBytes);
ByteBuffer readBuf = ByteBuffer.allocate(msgBytes.length);
// 讀寫迴圈皆非阻塞

Selector 架構 Echo Server

  1. 定義 TCPProtocol 介面:handleAccept/Read/Write(SelectionKey)。
  2. TCPServerSelector:建立 Selector,註冊多個 ServerSocketChannel (OP_ACCEPT),事件迴圈 selector.select() 後分派給 Protocol 實作。
  3. EchoSelectorProtocol:實作三個 handler,利用 SelectionKey.attach(ByteBuffer) 保存每連線緩衝區,key.interestOps() 動態調整關注事件。

關鍵 API

  • channel.register(selector, ops, attachment)
  • selector.select(timeout) 回傳就緒 Channel 數量。
  • key.isAcceptable()/isReadable()/isWritable()
  • Buffer.flip()/compact() 切換讀寫模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved