2013-05-11 6 views
-1

선택자가 작동하지 않는 이유를 찾으려고합니다. 코드는 다음과 같습니다.java.nio.channels.Selector.select()는 0을 반환합니다.

//SocketChannel ch 
//java.nio.channels.Selector impl 
//Object session 
SelectionKey sk = ch.register(impl, 0x01, session); 
int i = impl.select(); 
System.out.println(i); 

인쇄 된 값은 0입니다. 이것은 프로그램에서 SocketChannel.register의 유일한 호출이므로, 이해하는 한 :
a) 등록 중에 하나의 새 SelectionKey가 만들어 져야합니다.
b) 따라서 선택 중에 하나의 키의 "ready-operation set"을 업데이트해야합니다. 즉,이 메서드는 1을 반환해야합니다.

예상대로 작동하지 않는 이유는 무엇입니까? "준비 작업 세트가 업데이트 된 사람"이란 정확히 무엇입니까?

+0

왜? '채널'이란 무엇입니까? 어떤 상태입니까? (b)가 (a)에서 따 온다고 생각하게하는 이유는 무엇입니까? – EJP

+0

좋습니다. 그러면 "준비 작업 집합이 업데이트되었습니다." –

+0

System.out.println (ch.isBlocking()); System.out.println (ch.isConnected()); System.out.println (ch.isConnectionPending()); System.out.println (ch.isOpen()); System.out.println (ch.isRegistered()); System.out.println (ch.getRemoteAddress()); 준다 거짓 사실 거짓 사실 진정한 /192.168.1.249:14712 –

답변

1

사용중인 용어의 의미를 이해하지 못하는 것 같습니다. '준비'는 '차단하지 않고 I/O 작업을 실행할 준비가 됨'을 의미합니다. 예를 들어 OP_READ가 준비되면 read()는 읽은 바이트 수를 나타내는 양의 정수 또는 -1 스트림 끝을 나타내는 반환 값을 의미합니다. 특히, 읽을 수있는 데이터가 없음을 나타내는 0을 리턴하지 않습니다.

select()가 선택된 키와 함께 반환되어야 함을 증명하는 코드는 없습니다. 피어의 일부 외부 이벤트 만이 문제를 일으킬 수 있으며, 당신은 그것에 대해 아무 말도하지 않았습니다.

NB 마법 번호 0x01을 사용하지 마십시오. 선택 이벤트에 대한 매니페스트 상수는 SelectionKey.OP_READ 및 friends입니다. 그것을 써.