Java NIO は、ノンブロッキング I/O とポーリング メカニズムを使用して、イベントをリッスンするためのチャネルをセレクターに登録し、イベントを待機します。 ACCEPT、READ、WRITE イベントをループして処理します。ACCEPT イベントはクライアント接続を処理し、SocketChannel を作成します。READ イベントはデータを読み取り、WRITE イベントはデータを書き込みます。
Java 関数は、NIO を使用して大量の同時リクエストを処理します
はじめに
ノンブロッキング I/O (NIO) は、大量の同時リクエストを処理するための Java の効率的なテクノロジです。非同期操作とポーリング メカニズムを使用して、システム リソースを効果的に利用し、システムのスループットを向上させます。
手順
1. NIO セレクターの作成
NIO セレクターは、登録されたチャネル上のイベントをリッスンするために使用されます。
Selector selector = Selector.open();
2. チャンネルの登録
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 中国語 Web サイトの他の関連記事を参照してください。