Channels and Buffers : 데이터는 항상 채널에서 버퍼로 읽히거나 버퍼에서 채널로 쓰여진다.
[Non-blocking IO]
하나의 Thread는 버퍼에 데이터를 읽도록 채널에 요청할 수 있다. 채널이 버퍼로 데이터를 읽는 동안 Thread는 다른 작업을 수행할 수 있다.
[Selectors]
selector는 여러 개의 채널에서 이벤트를 관리할 수 있는 객체이다.
[Channels]
channel에서 buffer로 읽거나 buffer를 채널로 쓰거나 할 수 있다.
( 이전에는 OutputStream과 InputStream을 사용하였어야 하는데 Channel만으로 할 수 있게 되었다)
channel에는 여러가지 type이 있다.
- FileChannel : 파일에 데이터를 읽고 쓴다.
- DatagramChannel : UDP를 이용해 네트워크를 통해 데이터를 읽고 쓴다.
- SocketChannel : TCP를 이용해 네트워크를 통해 데이터를 읽고 쓴다.
- ServerSocketChannel : 들어오는 TCP 연결을 수신할 수 있다. 들어오는 연결마다 SocketChannel이 만들어진다.
[Buffers ]
채널과 상호작용할 때 사용된다. 데이터는 채널에서 버퍼로 읽혀지거나, 버퍼에서 읽혀 채널로 쓰여진다.
- 버퍼에 데이터 쓰기
- buffer.flip() 호출 → 읽기모드
- 버퍼에서 데이터 읽기
- buffer.clear() 호출 → 쓰기 모드
Selectors : 셀렉터를 사용하면 하나의 쓰레드가 여러 채널을 처리할 수 있다.
Selector는 사용을 위해 하나 이상의 채널을 Selector에 등록하고 select() 메서드를 호출해 등록된 채널 중 이벤트 준비가 완료된 하나 이상의 채널이 생길 때까지 block된다.
Selector selector = Selector.open(); // Selector 생성
selector에 채널을 등록하기 위해서는 register() 메서드를 사용해야 한다. (채널을 selector에 등록)
channel.configureBlocking(false);
// selector에 채널을 등록하기 위해서는 반드시 해당 채널이 non-blocking 모드로 변환되어야 한다.
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
SelectionKey : register() 메서드를 이용해 채널을 Selector에 등록하면 SelectionKey 객체가 반환된다.
Channel channel = selectionKey.channel();
Selector selector = selectionKey.selector();
Selector에 하나 이상의 채널을 등록한 후에는 select() 메소드를 호출할 수 있다. select() 메소드는 accept, connect, read, write 이벤트에 대해 준비되어 있는 채널을 반환한다.
select()메서드를 사용하면 개수가 반환된다. select() 메서드를 통해 하나 이상의 준비된 채널이 발생하면, selectedKeys() 메서드를 사용해 준비된 채널의 집합을 반환 받는다.
Set<SelectionKey> selectedKeys = selector.selectedKeys();
[ServerSocketChannel] : ServerSocket과 마찬가지로 들어오는 TCP 연결을 수신 대기 할 수 있는 채널이다.
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
}
ServerSocketChannel은 Non-blocking 모드로 설정이 가능하다.
SocketChannel은 TCP 네트워크 소켓에 연결된 채널이다. Socket의 역할과 같다.
SocketChannel도 non-blocking 모드로 설정할 수 있다.
'백엔드 > Network Programming' 카테고리의 다른 글
Socket Programming(3) - Socket for Server (0) | 2022.11.21 |
---|---|
Socket Programming(2) - Socket for Client (0) | 2022.11.13 |
Socket Programming(1) - socket이란? (0) | 2022.11.13 |
URL and URI's key (2) | 2022.10.15 |
Internet protocols and layers (2) | 2022.09.09 |