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

JDK 1.4 非阻塞套接字 API 概述:Selector、Channel 與 Buffer 核心機制

     編輯:Java 相關知識

背景:傳統阻塞 I/O 的瓶頸

Java 1.3 時代實現高併發服務器只有兩條路:多線程(一連接一線程)或第三方庫。前者線程管理複雜、上下文切換開銷大;後者引入外部依賴。JDK 1.4 (JSR 51) 引入 New I/O (NIO),核心是非阻塞套接字,允許單線程管理成千上萬連接。

核心組件

Buffer:數據容器

  • 有限容量、強類型(ByteBuffer、CharBuffer 等七種基本類型對應)。
  • 關鍵屬性:position(讀寫位置)、limit(邊界)、capacity(容量)。
  • 核心操作:put() 寫入、get() 讀取、flip() 切換讀寫模式、clear() 重置、allocateDirect() 分配堆外內存(零拷貝潛力)。

Channel:雙向傳輸通道

  • SocketChannel、ServerSocketChannel 替代傳統 Socket。
  • 可配置為非阻塞模式:configureBlocking(false)。
  • 數據通過 Buffer 讀寫:channel.read(buffer)、channel.write(buffer)。

Selector:多路復用器

  • 單線程監聽多個 Channel 的就緒事件:OP_ACCEPT、OP_CONNECT、OP_READ、OP_WRITE。
  • select() 阻塞直到有事件,返回就緒鍵集合 selectedKeys()。
  • SelectionKey 封裝 Channel、事件類型、附件。

服務端非阻塞架構

ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(8000));
Selector selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
    selector.select(); // 阻塞等待事件
    for (SelectionKey key : selector.selectedKeys()) {
        if (key.isAcceptable()) {
            SocketChannel client = server.accept();
            client.configureBlocking(false);
            client.register(selector, SelectionKey.OP_READ); // 註冊讀事件
        } else if (key.isReadable()) {
            SocketChannel client = (SocketChannel) key.channel();
            ByteBuffer buffer = ByteBuffer.allocate(32);
            client.read(buffer);
            buffer.flip();
            // 解碼處理...
        }
        // 處理完必須 key.cancel() 或 iterator.remove()
    }
}

客戶端非阻塞示例

客戶端註冊 OP_CONNECT,連接成功後註冊 OP_WRITE 循環發送數據。演示多客戶端交錯發送,服務端單線程交錯處理,證明非阻塞特性。

關鍵設計要點

  1. 事件驅動:不再阻塞於單個連接的讀寫,由 Selector 統一調度。
  2. Buffer 翻轉:寫入後 flip() 切換讀模式,讀完 clear() 或 compact() 重置。
  3. 編解碼器:CharsetDecoder/Encoder 處理字節↔字符轉換(如 ISO-8859-1)。
  4. 取消鍵:處理完事件必須從選鍵集移除,否則無限循環。

結語

NIO 非阻塞套接字是 Java 高性能網絡編程的里程碑。無需手動管理線程池,單線程即可支撐萬級併發連接,為 Netty、Mina 等高性能網絡框架奠定基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved