Java Network Programming (3) - Selector

Status
Publishing
Created By
Empty
Last Edited Time
7/13/2020, 3:34:00 PM
Description
Empty
Tags
Java
네트워크
개요
NIO Non-Blocking Socket를 이용하여 하나의 스레드에서 여러 Socket를 처리할 수 있도록 도와주는 클래스이다.
목적
기존 IO Socket에서는 사용하여 스레드에서 읽기, 쓰기를 할 때 Blocking이 되어 하나의 스레드당 하나의 Socket(Client)뿐이 처리할 수 밖에 없었다. 하지만 NIO Socket(Channel)와 Selector를 사용하여 Event 기반(Writeable, Readable, Acceptable, Connectable)으로 한 쓰레드 당 여러 Channel를 처리할 수 있다.
Flow
1.
Selector 생성
Selector selector = Selector.open();
Java
2.
channel을 Selector에 등록
ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ServerSocketChannel.bind(new InetSocketAddress(port)); ssc.register(selector, SelectionKey.OP_ACCEPT);
Java
3.
사용 가능할 때 사용하기 위한 채널을 선택
int keyCount = selector.select(); if(keyCount == 0) continue; /* 선택된 키셋 얻기 */ Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectedKeys.iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); if (selectionKey.isAcceptable()) { /* accept 작업 처리 */ } else if (selectionKey.isReadable()) { /* read 작업 처리 */} else if (selectionKey.isWritable()) { /* write 작업 처리 */ } else { /* 예외 처리 */ } /* 이후에 selectedKeys에 현재 selectedKey가 남아 있는 것을 지우기 위함 */ iterator.remove(); }
Java
Select(system call) Flow
socket1을 readfds(읽기가능한 fd 그룹)에 등록을 한다고 가정한 뒤, readabie 상태가 됐을 때 select가 처리하는 흐름을 아래와 같이 보여준다.
1.
초기
2.
select에 등록
3.
select는 등록된 fd에 이벤트가 일어났는지 확인
4.
socket1(fd 3)에 데이터가 수신
5.
select는 fd 3(socket1)에 해당하는 영역을 1로 변환 후 반환한다.
주요 클래스
Selector
메소드
이름
반환값
설명
close()
Open
Selector
selector를 close한다. close 한 후, close된 Selector에 대해서 method를 사용한다면, ClosedSelectorException를 던진다.
isOpen()
Open
boolean
selector open 유무를 반환한다.
keys()
Open
Set\<SelectionKey>
selector의 key set을 반환한다. 직접적으로 Key Set를 변경하려 하면 UnsupportedOperationException 던진다.
selectedKeys()
Open
int
selector의 selected-key set를 반환한다.
select()
Open
int
최소한 하나의 채널이 작업처리 준비가 될 때까지 blocking된다.
select(long timeout)
Open
int
select와 동일하지만, 주어진 시간동안 blocking 한다.
selectNow()
Open
int
호출 즉시 반환한다. 작업 처리가 준비된 채널이 있으면 채널 수를 반환하고 없다면 0을 반환한다.
wakeup()
Open
Selector
select가 즉시 반환된다.
Count9
SelectionKey
속성
이름
타입
설명
OP_CONNECT
Open
static int
socket connect에 대한 bit
OP_READ
Open
static int
read에 대한 bit
OP_WRITE
Open
static int
write에 대한 bit
Count4
메소드
이름
반환값
설명
attachment()
Open
Object
attach()로 등록된 객체를 반환한다.
cancel()
Open
void
해당 SelectionKey를 Selector에서 삭제한다. 취소된 Key 집합에 포함된다.
channel()
Open
SelectableChannel
연관있는 등록된 채널을 반환한다.
interestOps()
Open
int
관심있는 OP_*를 반환한다.
interestOps(int ops)
Open
SelectionKey
관심있는 OP_*를 등록한다.
isAcceptable()
Open
boolean
accptable 유무를 반환한다.
isConnectable()
Open
boolean
connectable 유무를 반환한다.
isReadable()
Open
boolean
readable 유무를 반환한다.
isWriteable()
Open
boolean
Writeable 유무를 반환한다.
isValid()
Open
boolean
유효한 Key 유무를 반환한다.
readyOps()
Open
int
준비된 OP_*를 반환한다.
selector()
Open
Selector
연관된 Selector를 반환한다.
Count13