2011-02-26 40 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数据。

最终,服务器启动并且此连接已成功完成。

我知道这是一个答案,而不是提示,但它是我们的任务:)