2009-11-11 76 views
0

即時通訊嘗試使用異步連接實現客戶端應用程序。我想知道如果我可以重新使用一個SocketChannel對象後,它無法連接到服務器。重複使用套接字通道

SocketChannel channel = SocketChannel.open(); 
    channel.configureBlocking(false); 
    InetSocketAddress addr = new InetSocketAddress(host, port); 
    SelectionKey key = channel.register(select, SelectionKey.OP_READ, connection); 
    channel.connect(addr); 

這是選擇循環後,我的套接字最終被選中,因爲連接失敗。我想排隊在該頻道的另一個連接嘗試,並且我似乎沒有做任何事情。 channel.isConnectionPending()方法總是返回true(即使我嘗試finishConnect)

是唯一的解決方案擺脫這種SocketChannel並創建一個新的?

回答

1

Sun已經發布了GPL下的Java 6.0源代碼。 "Read the source Luke"

而我對代碼的閱讀是,你不能再次調用連接。

+0

是的,似乎一旦狀態達到懸而未決,就沒有任何聲明讓它回到未連接狀態。 – aepurniet 2009-11-12 01:34:34

0

嗯......我不是NIO的專家,但有些東西看起來很腥。您正在註冊OP_ACCEPT,當偵聽頻道收到傳入連接時發生 - 但是,您正在使用該頻道作爲傳出連接。

您應該發佈更多的代碼,包括select循環。

+0

ahh對不起,從代碼 中的其他方法複製並粘貼固定。 – aepurniet 2009-11-11 22:13:12

+0

虐待發布更多的代碼,但問題是非常具體的,我可以調用兩次套接字通道連接。世界上所有的代碼都不會在這方面闡明更多的信息。 (除了sdk代碼,嗯......) – aepurniet 2009-11-11 22:17:21

0

試試看吧?

我不是100%肯定的,但我懷疑你可以一次完成連接已被調用並返回或從它拋出的異常可能是好的。

在連接周圍放置一個try/catch塊,當發生異常時,可能會再次調用channel.connect方法。

如果它不起作用,那麼答案可能是否定的。