这是一个类的任务,所以我需要的不仅仅是回答。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上出现故障?