這是一個類的任務,所以我需要的不僅僅是回答。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上出現故障?