3

我没有使用任何选择器或类似的东西。我只是在阻塞模式下进行简单的ServerSocketChannel聆听和SocketChannel连接。我想对连接施加超时,但SocketChannel.socket().setSoTimeout()不起作用。

我尝试让后台线程休眠 30 秒并检查变量是否仍然存在null(因为它会阻止等待读取该变量)但我无法正确同步变量,因为我无法访问匿名中的局部变量班级。

还有其他方法可以做到这一点吗?

更新:我的问题措辞错误。我还希望读取操作以及连接本身超时。

4

2 回答 2

2

setSoTimeout()设置读取超时,而不是连接超时,并且由于某种原因,它根本不起作用SocketChannels,即使在阻塞模式下,甚至在包装流中也是如此。

您正在寻找的方法channel.socket().connect()有两个参数。

于 2013-02-27T21:18:33.700 回答
-1

据我所知,这是不可能在nio. Socket.setSoTimeout()通过影响读取和写入但不建立连接的套接字超时设置。

即使在系统库级别,连接超时也不同于读/写超时 - 请参阅man 2 connect,了解详细信息。因此,如果您想要连接时真正的、应用程序控制的超时,您需要使用异步连接协议和适当的, check等。不幸的是,这使得代码更长一些。man 2 setsockoptman 7 socketSelectorSelectionKey.isConnectable()

我现在手头没有 Java lib 源代码,但是研究Socket.connect(SocketAddress endpoint,int timeout)内部实现方式会很有趣——但我相信它select()也在内部使用。

于 2013-02-27T21:19:23.917 回答