Rumah >Java >javaTutorial >Bagaimanakah fungsi Java menggunakan teknologi NIO untuk mengendalikan permintaan serentak yang tinggi?
Java NIO ialah teknologi yang cekap untuk mengendalikan permintaan serentak tinggi Ia menggunakan I/O yang tidak menyekat dan mekanisme pengundian untuk melaksanakan: mencipta Pemilih NIO untuk mendengar acara dan mendengar acara TERIMA; gelung dan proses acara TERIMA, BACA, TULIS; acara TERIMA mengendalikan sambungan pelanggan dan mencipta SocketChannel acara READ membaca data, dan acara WRITE menulis kembali data.
Fungsi Java menggunakan NIO untuk mengendalikan permintaan serentak yang tinggi
Pengenalan
Non-blocking I/O (NIO) ialah teknologi yang cekap di Java untuk mengendalikan sejumlah besar permintaan serentak. Ia menggunakan operasi tak segerak dan mekanisme pengundian untuk menggunakan sumber sistem dengan berkesan dan meningkatkan daya pemprosesan sistem.
Langkah
1 Buat Pemilih NIO
Pemilih NIO digunakan untuk mendengar acara di Saluran yang didaftarkan.
Selector selector = Selector.open();
2. Daftar Saluran
Daftar ServerSocketChannel ke Selector dan dengar acara TERIMA.
ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.register(selector, SelectionKey.OP_ACCEPT);
3. Gelung menunggu acara
Dengar acara melalui kaedah Selector.select().
while (true) { selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); // 处理事件... }
4. Mengendalikan acara TERIMA
Apabila acara TERIMA berlaku, terima sambungan dan buat SocketChannel.
if (key.isAcceptable()) { ServerSocketChannel channel = (ServerSocketChannel) key.channel(); SocketChannel clientChannel = channel.accept(); clientChannel.configureBlocking(false); clientChannel.register(selector, SelectionKey.OP_READ); }
Kes praktikal
Berikut ialah contoh pelayan Java NIO Echo yang mudah. Ia mendengar sambungan pelanggan dan gema mesej yang diterima.
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(); } }
Atas ialah kandungan terperinci Bagaimanakah fungsi Java menggunakan teknologi NIO untuk mengendalikan permintaan serentak yang tinggi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!