2014-10-19 228 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); 

如果該端口未打開,覺得我看起來同樣它返回0, 但是當端口是開放的,它也返回0,我希望它可以返回1.

+0

不知道這件事情,但可能是因爲你指定了configureBlocking(false) - 這是否意味着操作是異步的,你不知道它何時結束? – RenniePet 2014-10-19 12:20:00

+0

我認爲執行此代碼時會返回1,因爲寫入通道已準備就緒,但它返回0,所以我很困惑。@ RenniePet – firebroo 2014-10-19 12:30:40

+0

爲什麼其他答案被刪除? – firebroo 2014-10-19 23:13:45

回答

1

這是因爲你'選擇錯誤的事件。您應該已經註冊了頻道OP_CONNECT.然後,當您得到它時,請致電finishConnect(),如果它返回真正取消註冊OP_CONNECT並註冊您在下一個感興趣的事件,即OP_READOP_WRITE

請注意,如果finishConnect()返回false您應該繼續選擇,如果它引發異常連接失敗,您應該關閉通道。

如果您想要避免所有這些複雜情況,那麼在處於阻塞模式時進行連接通常會更簡單,然後將通道置於非阻塞模式並進行選擇。

儘管在客戶端中使用NIO確實沒有什麼意義。

請參閱here這個答案的更全面的版本。

+0

當我使用 socketChannel.register(selector,SelectionKey.OP_CONNECT); int result = selector.select(); System.out.println(result); 它總是返回1端口是否打開,所以當端口關閉時什麼事件準備好了?爲什麼它也返回1. @ EJP – firebroo 2014-10-20 00:11:25

+0

因爲它希望你調用'finishConnect()',如上所述。所以那樣做。然後你會得到真,假或者異常。 – EJP 2014-10-20 01:09:15

相關問題