2010-04-01 18 views
5

使用非阻塞I/O,用於連接到遠程地址代碼看起來是這樣的:指定的java.nio中的連接超時

SocketChannel channel = SelectorProvider.provider().openSocketChannel(); 
channel.configureBlocking(false); 
channel.connect(address); 

連接過程便要被上調用finishConnect()完成當某個選擇器說通道時,對應的鍵isConnectable()

是否有使用這個成語時指定連接超時的方法嗎?

回答

0

有趣的問題。我不確定那個nio本身提供了一個解決方案。

根據我的經驗,我運行了一個Callable來嘗試連接,然後使用Future來輪詢響應,使用'interval'和'timeout'變量循環並使用Thread.sleep()作爲響應。

希望這點你一個有用的方向......

另外,我建議你看看Apache的米納(你可以描述米娜作爲NIO框架)。它處理了很多這種東西對你來說,例如在StreamIoHandler http://mina.apache.org/report/trunk/apidocs/org/apache/mina/handler/stream/StreamIoHandler.html

1

的問題並沒有真正意義。超時適用於阻止模式。如果需要,請將通道置於阻止模式並致電channel.socket().connect(address, timeout);。如果你想要非阻塞模式,使用你當前的代碼;然後創建一個選擇器;註冊頻道OP_CONNECT;當你得到它叫finishConnect(),,如果這返回真正取消註冊OP_CONNECT並繼續其餘的代碼。