这是一个课堂作业,所以我需要的不仅仅是答案。
我有一个进程在四个虚拟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() && key.isConnectable()都为真时,我认为有一个服务器可供我连接。我打电话给
SocketChannel connectingChannel = (SocketChannel)key.channel()
connectingChannel.finishConnect()当我看到key.isValid() && key.isReadable()时,我读入了我收到的一条消息。
只要我按A、B、C、D的顺序启动进程,这个进程就可以工作。如果我只启动B,它就会在finishConnect语句中失败。
我阅读了文档,其中isConnectable测试这个键的通道是否已完成或未能完成其套接字连接操作。为什么isConnectable是真的,而我在finishConnect上得到一个失败?
发布于 2011-02-27 13:31:55
我们在finishConnect周围包装了一个try/catch。在catch内部,我们在当前SelectionKey上调用了cancel,然后调用了尝试连接的方法(原始问题描述中的第二个片段):
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之间的关系,以便在进行重试时拥有它们。因此,在捕获中,在取消之前,我们使用失败的SocketChannel来查找我们将需要的必要的A机器和A端口数据。
最后,服务器出现了,这个连接成功了。
我知道这是一个答案,不是暗示,但这是我们的任务:)
https://stackoverflow.com/questions/5124934
复制相似问题