首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SocketChannel连接的Java问题

SocketChannel连接的Java问题
EN

Stack Overflow用户
提问于 2011-02-26 11:54:26
回答 1查看 1.6K关注 0票数 0

这是一个课堂作业,所以我需要的不仅仅是答案。

我有一个进程在四个虚拟linux机器上运行。每个进程都与它的两个邻居通信。每个进程使用

代码语言:javascript
复制
server = ServerSocketChannel.open()
server.configureBlocking(false)
server.socket().bind(new InetSocketAddress(port))
server.register(selector, SelectionKey.OP_ACCEPT)

在启动时,进程A不会尝试连接到任何人。进程B可以

代码语言:javascript
复制
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()都为真时,我认为套接字正试图连接到我,于是我调用

代码语言:javascript
复制
SocketChannel client = server.accept()
client.configureBlocking(false)
client.register(selector, client.validOps() )

当我看到key.isValid() && key.isConnectable()都为真时,我认为有一个服务器可供我连接。我打电话给

代码语言:javascript
复制
SocketChannel connectingChannel = (SocketChannel)key.channel()
connectingChannel.finishConnect()

当我看到key.isValid() && key.isReadable()时,我读入了我收到的一条消息。

只要我按A、B、C、D的顺序启动进程,这个进程就可以工作。如果我只启动B,它就会在finishConnect语句中失败。

我阅读了文档,其中isConnectable测试这个键的通道是否已完成或未能完成其套接字连接操作。为什么isConnectable是真的,而我在finishConnect上得到一个失败?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-27 13:31:55

我们在finishConnect周围包装了一个try/catch。在catch内部,我们在当前SelectionKey上调用了cancel,然后调用了尝试连接的方法(原始问题描述中的第二个片段):

代码语言:javascript
复制
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端口数据。

最后,服务器出现了,这个连接成功了。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5124934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档