SocketChannel 의 read 방법 을 신중하게 사용 하 세 요.

1063 단어 기술 점적
다음 코드 는 SocketChannel 을 실례 화 하 는 과정 입 니 다.
		SocketChannel channel = SocketChannel.open();
		//       
		channel.socket().connect(addr,connectionTimeOut_ms);
		//     
		channel.socket().setSoTimeout(timeout_ms);
 
그리고 NIO 의 일관성 숭배 를 바탕 으로 channel.read()가 데 이 터 를 읽 습 니 다.
int java.nio.channels.ReadableByteChannel.read(ByteBuffer dst) throws IOException

Reads a sequence of bytes from this channel into the given buffer. 

 
불행 하 게 도 이 SocketChannel 의 read()방법 은 Socket 과 달리 시간 초과 설정 이 없습니다!
 
그래서 위 에 socket 의 시간 초과 설정 을 만 들 었 는데 채널 read 에 서 는 소 용이 없습니다.구체 적http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4614802 。
 
 
 
이 문 제 를 해결 하 는 데 있어 서 는 전통 적 인 Socket 블록 으로 전체 흐름 을 읽 어 보 는 것 을 권장 합 니 다.또는 Readable ByteChannel 같은 종 류 를 사용 하여(읽 기와 쓰기 의 양 방향 채널 차단 문 제 를 해결 할 수 없 음)Socket 흐름 을 밀봉 하고 한 바퀴 더 돌 았 을 뿐 입 니 다.
 
//i.  buffer chanel
InputStream is = sock.socket().getInputStream();
ReadableByteChannel readCh = Channels.newChannel(is);

좋은 웹페이지 즐겨찾기