繁体   English   中英

SocketChannel连接的Java问题

[英]Java trouble with SocketChannel connections

这是一个课堂作业,因此我需要的不仅仅是提示。

我有一个在四台虚拟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上出现故障?

我们在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机和A端口之间的关系,因此重试时将具有它们。 因此,在取消之前的陷阱中,我们使用了发生故障的SocketChannel查找我们将需要的必要的A机和A端口数据。

最终,服务器启动,此连接成功建立。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM