[java] 자바 NIO 소켓 프로그래밍의 선택기와 다중 채널 처리

자바 NIO(New I/O)는 넌블로킹 IO(non-blocking I/O)를 위한 기능을 제공하여 네트워크 및 파일 I/O의 성능을 향상시킵니다. 이 기능을 활용하여 다중 채널을 동시에 처리할 수 있습니다. 이 글에서는 자바 NIO의 선택기(selectors)와 다중 채널 처리에 대해 알아보겠습니다.

1. 선택기(selectors)의 개념

NIO의 선택기(selectors)는 다중 채널을 관리하고 넌블로킹 I/O 이벤트를 모니터링하는 데 사용됩니다. 선택기를 사용하면 한 쓰레드로 여러 개의 채널을 모니터링하여 입출력 이벤트를 처리할 수 있습니다. 선택기는 Selector 클래스를 사용하여 생성할 수 있습니다.

2. 선택기(selectors)의 동작 방식

선택기는 등록된 채널들의 I/O 이벤트를 감지하고 이벤트가 발생한 채널들을 식별하여 해당 이벤트를 처리합니다. 선택기는 다음과 같은 네 가지 종류의 I/O 이벤트를 감지할 수 있습니다.

3. 다중 채널 처리

다중 채널 처리를 위해서는 다음과 같은 단계를 거칩니다.

  1. 선택기 생성 : Selector.open()
  2. 채널 등록 : SelectableChannel.register()
  3. 이벤트 감지 : Selector.select()
  4. 이벤트 처리 : SelectionKey
Selector selector = Selector.open(); // 선택기 생성
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 채널 등록

while (true) {
    selector.select(); // 이벤트 감지
    Set<SelectionKey> selectedKeys = selector.selectedKeys();
    Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
    while (keyIterator.hasNext()) {
        SelectionKey key = keyIterator.next();
        if (key.isAcceptable()) {
            // 연결 수락 이벤트 처리
        } else if (key.isReadable()) {
            // 읽기 이벤트 처리
        } else if (key.isWritable()) {
            // 쓰기 이벤트 처리
        }
        keyIterator.remove();
    }
}

위의 코드에서는 선택기를 생성하고 서버 소켓 채널을 등록한 후, 선택기를 통해 이벤트를 감지하고 해당 이벤트를 처리하는 과정을 보여줍니다.

마무리

이상으로 자바 NIO의 선택기와 다중 채널 처리에 대해 알아보았습니다. 선택기와 다중 채널 처리를 통해 네트워크 프로그래밍에서의 성능과 확장성을 향상시킬 수 있습니다.

참고 문헌: