Java NIO 是一種處理高並發請求的高效技術,使用非阻塞I/O 和輪詢機制實作:建立NIO Selector 監聽事件;註冊Channel 到Selector,監聽ACCEPT 事件;循環等待事件,處理ACCEPT、 READ、WRITE 事件;ACCEPT 事件處理客戶端連接,建立SocketChannel;READ 事件讀取數據,WRITE 事件回寫資料。
Java 函數使用NIO 處理高並發請求
簡介
#非阻塞I/O (NIO) 是Java 中一種用於處理大量並發請求的高效技術。它透過非同步操作和輪詢機制,有效地利用系統資源,提升系統吞吐量。
步驟
1. 建立 NIO Selector
NIO Selector 用於監聽註冊的 Channel 上的事件。
Selector selector = Selector.open();
2. 註冊 Channel
將 ServerSocketChannel 註冊到 Selector,監聽 ACCEPT 事件。
ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.register(selector, SelectionKey.OP_ACCEPT);
3. 迴圈等待事件
透過 Selector.select() 方法監聽事件。
while (true) { selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); // 处理事件... }
4. 處理 ACCEPT 事件
當 ACCEPT 事件發生時,接受連線並建立 SocketChannel。
if (key.isAcceptable()) { ServerSocketChannel channel = (ServerSocketChannel) key.channel(); SocketChannel clientChannel = channel.accept(); clientChannel.configureBlocking(false); clientChannel.register(selector, SelectionKey.OP_READ); }
實戰案例
以下是一個簡單的 Java NIO Echo 伺服器範例。它監聽客戶端連接,並回顯收到的訊息。
EchoServer.java
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; public class EchoServer { private Selector selector; private ServerSocketChannel serverChannel; private int port; public EchoServer(int port) { this.port = port; } public void start() throws IOException { // 创建 Selector selector = Selector.open(); // 创建 ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.bind(new InetSocketAddress(port)); serverChannel.register(selector, SelectionKey.OP_ACCEPT); // 不断循环等待事件 while (true) { int keysCount = selector.select(); if (keysCount == 0) { continue; } Set<SelectionKey> keys = selector.selectedKeys(); for (SelectionKey key : keys) { try { if (key.isAcceptable()) { handleAccept(key); } else if (key.isReadable()) { handleRead(key); } else if (key.isWritable()) { handleWrite(key); } } catch (IOException e) { e.printStackTrace(); key.cancel(); SocketChannel channel = (SocketChannel) key.channel(); channel.close(); } } keys.clear(); } } private void handleAccept(SelectionKey key) throws IOException { ServerSocketChannel channel = (ServerSocketChannel) key.channel(); SocketChannel clientChannel = channel.accept(); clientChannel.configureBlocking(false); clientChannel.register(selector, SelectionKey.OP_READ); } private void handleRead(SelectionKey key) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int readBytes = channel.read(buffer); if (readBytes == -1) { channel.close(); return; } buffer.flip(); channel.write(buffer); } private void handleWrite(SelectionKey key) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); channel.write(ByteBuffer.allocate(1024)); } public static void main(String[] args) throws IOException { new EchoServer(9090).start(); } }
以上是Java 函數如何使用 NIO 技術處理高並發請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!