深入淺出講解 Java NIO 核心三大元件,對比傳統阻塞 I/O 與多執行緒模型缺點,完整實作非阻塞 Echo Client/Server,展示 Selector 事件驅動架構。
Socket 調用阻塞,大量連線需建立大量執行緒 → 硬體資源耗盡、執行緒切換開銷大、優先級難控制、Client 間交互困難。java.nio.channels.Channel:可註冊至 Selector 的 I/O 來源 (檔案/網路)。java.nio.channels.Selector:監控多個 Channel 的就緒事件。java.nio.Buffer:讀寫資料的容器,取代 Stream,可控制緩衝區大小與操作。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);
// 讀寫迴圈皆非阻塞
TCPProtocol 介面:handleAccept/Read/Write(SelectionKey)。TCPServerSelector:建立 Selector,註冊多個 ServerSocketChannel (OP_ACCEPT),事件迴圈 selector.select() 後分派給 Protocol 實作。EchoSelectorProtocol:實作三個 handler,利用 SelectionKey.attach(ByteBuffer) 保存每連線緩衝區,key.interestOps() 動態調整關注事件。channel.register(selector, ops, attachment)selector.select(timeout) 回傳就緒 Channel 數量。key.isAcceptable()/isReadable()/isWritable()Buffer.flip()/compact() 切換讀寫模式。