넌 블럭(Non-blocking) 소켓채널(SocketChannel)에서 읽기(read) 타임아웃 처리하기..

자바의 기본 소켓채널(SocketChannel)의 read 메서드는 타임아웃(timeout)을 제공하지 않는다. 소켓채널의 socket() 메서드로 받아온 소켓객체에 타임아웃을 설정해도 타임아웃이 먹지 않는다. 기존의 스트림 기반의 네트웍 통신을 하는 애플리케이션이라면 조금 생소할 수도 있으나, read 타임아웃은 미션 크리티컬한 서버에서는 매우 중요한 이슈이다. 타임아웃이 없어서 연결이 종료가 안 되면 서버나 클라이언트가 동작을 멈추게 될 수도 있으니 말이다.

그래서, 넌 블럭(Non-blocking)의 read 메서드에 호출하기 전에 while문으로 둘러싸서 타임아웃 기능을 구현할 수 있다. 이 코드는 busy waiting하는 형태의 간단한 타임아웃 기능이 추가되었다.

// 20초                
long timeout = 20 * 1000;   
long stime = new Date().getTime();
long rtime = 0L;

int rvalue =0;
int rvalues = 0;
while (rtime < timeout ) {
	rtime = System.currentTimeMillis() - stime;
	rvalue = channel.read(rbuffer);
	if(rvalue == -1)
		throw new Exception("connection closed");

	rvalues = rvalues + rvalue;
	if(rtime > timeout)
		throw new Exception("read timeout exception");

	if(rvalues >= 4)
		break;
}

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.