NIO 기술은 비차단 IO 작업을 처리하고 이벤트 기반 메커니즘을 사용하여 I/O를 비동기식으로 처리하여 동시 요청이 많은 시나리오에서 효율성을 향상시킵니다. 채널 정의, 선택기 생성, 선택기에 채널 등록, 이벤트 수신 및 이벤트 단계 처리를 통해 IO 작업을 관리합니다. 실제 사례에서는 NIO를 사용하여 클라이언트 연결 요청을 비동기적으로 수락하고 응답하는 서버측 비차단 Echo 프로그램을 보여줍니다.
Java 함수의 NIO 기술은 비차단 IO 작업을 처리합니다.
NIO(비차단 IO)는 대규모 네트워크 애플리케이션에서 높은 동시 요청을 처리하는 효율적인 방법이며, 이벤트 드라이버를 통해 비차단 모드를 사용합니다. I/O를 비동기적으로 처리하는 메커니즘입니다. NIO API는 NIO 이벤트, 채널 및 버퍼를 설명하기 위해 Java로 제공됩니다.
1. NIO 채널 정의
NIO의 채널은 열린 파일 또는 네트워크 연결을 나타냅니다. 채널에는 네 가지 주요 유형이 있습니다.
import java.nio.channels.*; // 文件通道 FileChannel fileChannel = FileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ); // 套接字通道 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 套接字通道 SocketChannel socketChannel = SocketChannel.open(); // 套接字通道 DatagramChannel datagramChannel = DatagramChannel.open();
2. 선택기 만들기
선택기는 여러 채널의 이벤트를 모니터링하는 데 사용됩니다. 서로 다른 채널의 많은 연결을 동시에 처리할 수 있으므로 IO 작업을 효율적으로 관리할 수 있습니다.
import java.nio.channels.Selector; Selector selector = Selector.open();
3. 채널 등록
읽기/쓰기 작업과 같은 관심 있는 이벤트를 모니터링하려면 선택기에 채널을 등록하세요.
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
4. 이벤트 수신
이벤트가 발생할 때까지 선택기에서 이벤트를 모니터링하려면 select()
메서드를 사용하세요. 이 메서드는 하나 이상의 채널이 처리 준비가 될 때까지 차단됩니다. select()
方法监视 Selector 中的事件,直到有事件发生。该方法会阻塞,直到至少有一个通道准备好处理。
int numKeys = selector.select();
5. 处理事件
通过检查 SelectionKey
for (SelectionKey key : selector.selectedKeys()) { if (key.isAcceptable()) { // 监听新的连接请求 } else if (key.isReadable()) { // 读取数据 } else if (key.isWritable()) { // 写入数据 } }
5. 이벤트 처리
이벤트가 발생한 채널 및 유형에 대한 세부 정보를 제공하는SelectionKey
를 확인하여 발생하는 이벤트를 처리합니다. import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.Iterator; import java.util.Set; public class NonBlockingEchoServer { public static void main(String[] args) throws IOException { // 创建一个 ServerSocketChannel ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(8080)); serverSocketChannel.configureBlocking(false); // 创建一个 Selector Selector selector = Selector.open(); // 注册 ServerSocketChannel 到 Selector,监视 ACCEPT 事件 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { // 监听事件 selector.select(); // 获取选择的 SelectionKey 集合 Set<SelectionKey> selectedKeys = selector.selectedKeys(); // 遍历选择的 SelectionKey Iterator<SelectionKey> iterator = selectedKeys.iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); if (key.isAcceptable()) { // 新的连接请求 SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); } else if (key.isReadable()) { // 读取数据 SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int readBytes = socketChannel.read(buffer); if (readBytes > 0) { // 响应客户端消息 buffer.flip(); socketChannel.write(buffer); } } // 从集合中删除处理过的 SelectionKey iterator.remove(); } } } }
위 내용은 NIO 기술은 Java 기능에서 비차단 IO 작업을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!