2014-10-19 4 views
0

포트를 열 것인지 여부를 결정하고 싶습니다.selector.select()가 항상 0을 반환하는 이유

InetSocketAddress address = new InetSocketAddress("www.google.com", 80); 
Selector selector = Selector.open(); 
SocketChannel socketChannel = SocketChannel.open(); 
socketChannel.configureBlocking(false); 
socketChannel.connect(address); 
socketChannel.register(selector, SelectionKey.OP_WRITE); 
int result = selector.select(); 
System.out.println(result); 

포트가 열려 있지 않은 경우, 나는 그것이 그것의 1

+0

이것에 대해 모르겠지만 configureBlocking (false)을 지정했기 때문일 수 있습니다. 이는 비동기식이며 종료 시점을 알 수 없습니까? – RenniePet

+0

쓰기 채널이 준비되었으므로이 코드를 실행할 때 1이 반환 될 것이라고 생각합니다.하지만 0을 반환하므로 혼란 스럽습니다. @ RenniePet – firebroo

+0

다른 답변이 삭제 된 이유는 무엇입니까? – firebroo

답변

1

반환 할 수 있습니다 기대는 0, 을 반환하지만 포트가 열려있을 때, 또한 0을 반환 같은 모양 생각 당신 때문에 잘못된 이벤트를 선택합니다. OP_CONNECT. 채널을 등록 했어야합니다. 수신 한 후 finishConnect()으로 전화를 걸면 true를 반환하면 OP_CONNECT을 등록하고 관심있는 이벤트 (예 : OP_READ 또는 OP_WRITE)를 등록합니다.

false을 반환하는 경우 계속 선택해야하며 예외가 발생하면 연결이 실패하고 채널을 닫아야합니다

이 모든 복잡성을 피하려면 차단 모드에서 연결을 수행 한 다음 채널을 차단 모드로 설정하고 선택하십시오.

클라이언트에서 NIO를 사용하는 것은 실제로 거의 없습니다.

이 답변의 전체 버전을 보려면 here을 참조하십시오.

+0

내가 사용할 때 socketChannel.register (selector, SelectionKey.OP_CONNECT); int result = selector.select(); System.out.println (result); 포트가 열려 있는지 여부를 항상 1로 반환하므로 포트가 닫히면 어떤 이벤트가 준비됩니까? 또한 1을 반환하는 이유 @ EJP – firebroo

+0

위에서 설명한대로 finishConnect()를 호출해야하기 때문입니다. 그렇게해라. 그렇다면 진실, 거짓 또는 예외 중 하나를 얻게됩니다. – EJP