Java NIO는 비차단 I/O 및 폴링 메커니즘을 사용하여 이벤트를 수신하는 NIO 선택기를 생성하고 선택기에 채널을 등록하고 이벤트를 대기하는 효율적인 기술입니다. 루프 및 프로세스 ACCEPT, READ, WRITE 이벤트는 클라이언트 연결을 처리하고 READ 이벤트는 데이터를 읽고 WRITE 이벤트는 데이터를 다시 작성합니다.
Java 함수는 NIO를 사용하여 높은 동시 요청을 처리합니다.
소개
NIO(Non-blocking I/O)는 많은 수의 동시 요청을 처리하기 위한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!