2011-02-26 69 views
0

這是一個類的任務,所以我需要的不僅僅是回答。Java與SocketChannel連接的問題

我有一個進程在四臺虛擬linux機器上運行。每個進程與其兩個鄰居進行通信。每個過程使用

server = ServerSocketChannel.open() 
server.configureBlocking(false) 
server.socket().bind(new InetSocketAddress(port)) 
server.register(selector, SelectionKey.OP_ACCEPT) 

在啓動時,進程A不會嘗試連接到任何人。過程B確實

SocketChannel SC = SocketChannel.open() 
SC.configureBlocking(false) 
SC.connect(new INetSocketAddress(A-machine, A-port) 
SC.register(selector, SC.validOps()) 

過程C與B相同;和D與C.

接下來,我調用selector.select並遍歷任何selectedKeys。當我看到key.isValid()& & key.isAcceptable()都爲真,我覺得一個套接字嘗試連接到我,我叫

SocketChannel client = server.accept() 
client.configureBlocking(false) 
client.register(selector, client.validOps()) 

當我看到key.isValid()& &關鍵。 isConnectable()都是true,我認爲服務器可供我連接。我叫

SocketChannel connectingChannel = (SocketChannel)key.channel() 
connectingChannel.finishConnect() 

當我看到key.isValid()& & key.isReadable(),我在我收到的消息讀取。

如果我只啓動B,它在finishConnect語句中失敗,此過程在我按順序啓動進程時工作:A,B,C,D。

我讀了文檔isConnectable測試此密鑰的通道是否已完成或未完成其套接字連接操作。 isConnectable如何可以爲true,並且在finishConnect上出現故障?

回答

0

我們圍繞finishConnect包裹了一個try/catch。漁獲裏面,我們呼籲取消對當前的SelectionKey,然後叫了嘗試(在原來的問題說明第二個片段)的連接方法:

SocketChannel SC = SocketChannel.open() 
SC.configureBlocking(false) 
SC.connect(new INetSocketAddress(A-machine, A-port) 
SC.register(selector, SC.validOps()) 

預見,我們必須做到這一點,我們增加代碼來存儲SC和A-machine和A-port之間的關係,所以當我們重試時我們會得到它們。所以,在catch中,在取消之前,我們使用了失敗的SocketChannel來查找我們需要的必要的A-machine和A-port數據。

最終,服務器啓動並且此連接已成功完成。

我知道這是一個答案,而不是提示,但它是我們的任務:)